浅谈c++语言的copy构造函数和赋值运算符的重载

#include <iostream>

using namespace std;

class object
{
private :
    string s;

public :
    object(string str)
    :s(str)
    {}
    object(object &a)
    :s(a.s)
    {}
    void operator=(object &a) //赋值运算符重载1号
    {
        this->s = a.s;
    }
    void operator=(string str) //赋值运算符重载2号
    {
        this->s = str;
    }
    string get_value() //获取对象的值(此处为对象所对应的字符串s)
    {
        return this->s;
    }
    ~object() {}
};

int main()
{
    object a("Hello World");
    object b(a);
    object c = b;
    cout << a.get_value() << endl;
    cout << b.get_value() << endl;
    cout << c.get_value() << endl;
    c = "Hello C++";
    cout << c.get_value() << endl;

    return 0;
}

       上述代码实现了copy构造函数以及赋值运算符的重载,值得一提的是,即使你没有写copy构造函数和赋值运算符重载1号编译器也会默认生成这两个成员函数,如下(后面会说明当不需要这两个函数是怎样防止编译器为你生成这两个函数)。

#include <iostream>

using namespace std;

class object
{
private :
    string s;

public :
    object(string str)
    :s(str)
    {}
   void operator=(string str) //赋值运算符重载2号(参数为字符串)
    {
        this->s = str;
    }
    string get_value() //获取对象的值(此处为对象所对应的字符串s)
    {
        return this->s;
    }
    ~object() {}
};

int main()
{
    object a("Hello World");
    object b(a);
    object c = b;
    cout << a.get_value() << endl;
    cout << b.get_value() << endl;
    cout << c.get_value() << endl;
    c = "Hello C++";
    cout << c.get_value() << endl;

    return 0;
}

    上面两段代码的运行结果是相同的,接下来说一种可以防止编译器生成copy构造函数以及赋值运算符重载1号,这需要用到类的继承,在基类中将这两个函数设置为私有成员,便可防止编译器为其派生类生成这两个成员函数,代码如下:

#include <iostream>

using namespace std;

class parent
{
public :
    parent() {}
    ~parent() {}
private :
    parent(parent &a) {}
    void operator=(parent &a) {}
};

class object : public parent
{
private :
    string s;
public :
    object(string str)
    : s(str)
    {}
    void operator=(string str)
    {
        this->s = str;
    }
    string get_value()
    {
        return this->s;
    }
    ~object() {}
};

int main()
{
    object a("Hello World");
    // object b(a);
    // object c = b;
    cout << a.get_value() << endl;
    a = "Hello C++";
    cout << a.get_value() << endl;

    return 0;
}

        如果去掉上述两行语句的注释,则编译器会报error: use of deleted function 'object::object(object&)'这样的错误并且用note: declared private here警告用户拷贝构造函数在这里不能调用。

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++中的运算符重载(operator overloading)可以让我们自定义的行为,使其像内置型一样进行运算。其中一个常用的重载运算符就是赋值运算符(=)。 赋值运算符的默认行为是将一个对象的值赋给另一个对象。当我们自定义一个时,如果它包含指针成员,我们需要重载赋值运算符,以确保指针指向正确的地址,并避免内存泄漏。 下面是一个示例代码,演示了如何重载赋值运算符: ```c++ #include <iostream> using namespace std; class MyString { private: char* str; public: MyString(const char* s) { str = new char[strlen(s)+1]; strcpy(str, s); } // copy constructor MyString(const MyString& s) { str = new char[strlen(s.str)+1]; strcpy(str, s.str); } // destructor ~MyString() { delete [] str; } // assignment operator MyString& operator=(const MyString& s) { if (this != &s) { delete [] str; str = new char[strlen(s.str)+1]; strcpy(str, s.str); } return *this; } void print() { cout << str << endl; } }; int main() { MyString s1("Hello"); MyString s2("World"); s1 = s2; s1.print(); // output: World return 0; } ``` 在上面的代码中,我们定义了一个名为`MyString`的,它包含一个指向字符数组的指针`str`,并实现了构造函数、拷贝构造函数、析构函数赋值运算符赋值运算符的实现中,首先判断是否是自我赋值(即`this`指针和参数`s`指向同一个对象),如果是则返回当前对象的引用;否则,先释放当前对象的`str`指向的内存,然后新分配一块内存,将`s`的`str`指向的字符串复制到当前对象的`str`指向的内存中。 最后,赋值运算符返回当前对象的引用,以支持链式赋值操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值