test& operator=(const test &t)
return *this;
} void operator=(test t)
void main()
(1)形參中的test &t 與test t
如上兩種賦值語句的寫法,本身都可以執行,沒有錯誤,但是其內部差異以及優缺點很明顯,如上述**,t1給t2賦值過程中,等號實際是乙個符號的過載,實際背後是將t1作為引數傳遞,必將呼叫拷貝建構函式,這樣使得**效率降低,而使用引用傳遞,不會給形參t開闢乙個臨時的空間,而是外面t1的別名,所以不會呼叫拷貝建構函式。
(2)形參中的const test 與 test
為了保護類中的資料,加上const後表明類中的資料不能被修改,不可在該函式內部對test類的成員資料進行修改。例如t1是乙個物件,裡面資料都被初始化為0,需要用這個物件給其他同類物件進行賦值,我們希望其他類中資料的初始值也為0,則直接賦值即可,但有人不小心在賦值過載函式中對test類的資料成員進行了修改,則使用t2 = t1時,物件t2中的資料也將被修改,所以在形參前面加上const,表示我們不希望有人賦值函式中試圖修改資料,從而起到保護作用。
(3)if(this != &t)作用
如下c++背後的**轉換機制中,包含乙個當前物件的this指標,為了防止自己給自己賦值,通過該判斷提高了**執行效率,如下**中,當t1給t3賦值時,屬於自己給自己賦值,因為t3、t2本身都是t1的別名。
test& operator(const test &t) 轉換為 test& operator(test * const this, const test &t)
t2 = t1 轉換為 t2.operator = (&t2,t1)
test t1(10);
test &t2 = t1;
test &t3 = t2;
t3 = t1;
(4)返回型別test 與void
在物件的連等賦值中,因為operator函式的引數是乙個test型別,t1是乙個test物件,而(t2.operator=(t1))也要作為t3的operator的形參,所以t2.operator=(t1)要返回乙個test型別,return *this才能進行連等賦值。
t3=t2=t1 -> t3.operator=(t2.operator=(t1));
(5)返回值test的引用返回
1.第(4)部分進行連等過程中引數的傳遞需要乙個test型別,如果型別不是引用,則需要進行初始化,此時會呼叫拷貝建構函式,所以一般使用引用,提高效率。
2.並非任何**都提倡使用引用返回,如下**中tmp是我們的臨時變數,如果使用引用返回,則不在建立無名的臨時物件,此時返回引用指向真實的tmp,當該函式執行結束,tmp會被析構。我們平時的返回都會建立乙個無名的臨時空間用來存放臨時變數的返回,也就是函式體作為返回值賦值給變數或者物件。
3.一般地,如果函式體中的返回值變數不是該函式體的臨時變數,即當函式體生命週期結束後,函式所返回的變數或者物件依然有效,此時可以使用引用返回提高效率,反正不可。
#includeusing namespace std;
class test
test (const test ©_t) 拷貝建構函式
test& operator=(const test &t)
return *this;
}public:
int getdata() const
private:
int data;};
test fun(test x)
void main()
C 中的拷貝構造 賦值建構函式
c 中的拷貝構造,賦值構造的形式如下 eg a a a a const a a a operator const a a 物件以值傳遞方式從函式返回時,若接受返回值的物件已經初始化過,則會呼叫賦值建構函式,且該物件還會呼叫析構函式,當物件中包含指標時,會使該指標失效,因此需要過載賦值建構函式,使用類...
C 函式引數賦值
c 語法中有這樣一種規定 當呼叫函式時,沒有指定引數值,引數就會被賦預設值,但是,此函式必須是在第一次宣告或第一次定義的時候,給引數指定了預設值。在使用時應該注意以下幾點 第一點 引數預設值只允許設定一次,要麼在第一次函式宣告時設定,要麼在沒有函式宣告的情況下,在函式定義中設定 第二點 設定引數預設...
C 拷貝賦值函式
運用copy函式和copy assignment函式進行賦值操作應該注意的兩點 1 複製所有local成員變數 2 呼叫所有基類內的適當的copying函式。這裡面有乙個很可怕的規則 當你不用編譯器預設的拷貝函式或者賦值函式時,編譯器也不會對你自己寫的這兩個函式進行報警。所以必須要很謹慎和小心。對於...