拷贝和赋值区别

拷贝构造,对象赋值

拷贝是构造行为,状态取决于用于构造的对象;赋值是对已构造对象进行状态更新。赋值侧重于更新,构造侧重于构造。

等号不等于赋值,他可能是拷贝构造

下面这个语句被识别为构造

string str="apple";
string strr=str;//我是构造,不是赋值

下面这个语句被识别为赋值:

string str="apple";
string strr
strr=str;//我才是赋值

等号“=”是赋值还是构造取决于左值是否第一次出现。

函数返回值是拷贝构造

函数返回值如果是一个类,那么返回的对象首先将会被拷贝构造到一个临时对象,这个对象是const的。


A fun()
{
    A a;
    return a;//拷贝g构造到一个const temp_class_A中
}

class A
{
public:
    A() 
    { 
        cout << "Create" << endl; 
        m_i = 4396;
    }
    A(const A& a)
    { 
        m_i = a.m_i;
        std::cout << " A Copy constructor!" << endl; 
    }
    A& operator=(const A& a) 
    { 
        std::cout << " Assignement constructor!" << endl;
        return *this;
    };
    ~A() { std::cout << "Delete" << endl; }
    int m_i;
};
int main()
{
    A dd;
    dd= fun();

    return 0;
}

结果如下:
Create

Create                                     # dd对象创建
Create                                     # a对象创建
 A Copy constructor!                       # 返回语句,拷贝构造临时对象
Delete                                     # a对象析构
 Assignement constructor!                  # 返回值赋值
Delete                                     # 临时对象析构
Delete                                     # 主进程退出,dd对象析构

无论是拷贝构造还是状态赋值,最好将其唯一的参数设置为const属性,这是因为:

  • 拷贝和赋值,一般而言,状态是一模一样,不应该也没必要改变
  • 如果函数返回该类,必须声明为const才能匹配
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章