拷贝构造,对象赋值
拷贝是构造行为,状态取决于用于构造的对象;赋值是对已构造对象进行状态更新。赋值侧重于更新,构造侧重于构造。
等号不等于赋值,他可能是拷贝构造
下面这个语句被识别为构造
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
才能匹配