拷貝構造,對象賦值
拷貝是構造行爲,狀態取決於用於構造的對象;賦值是對已構造對象進行狀態更新。賦值側重於更新,構造側重於構造。
等號不等於賦值,他可能是拷貝構造
下面這個語句被識別爲構造
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
才能匹配