拷貝建構函式:只有單個形參,該形參是對本類型別物件的引用(一般常用const修飾),在用已存在的類型別物件建立新物件時由編譯器自動呼叫。
1.拷貝建構函式是建構函式的乙個過載形式
class date
date(const date&d)
private:
int _year;
int _month;
int _day;
};int main()
2.拷貝建構函式只有乙個引數且必須使用引用傳參,使用傳值方式會引發無窮遞迴呼叫
3.若未顯示定義,編譯器會生成預設的拷貝建構函式,預設的拷貝建構函式會按照成員的宣告順序依次拷貝類成員進行初始化。
c++為了增強**的可讀性引入了運算子過載,運算子過載是具有特殊函式名的函式,也具有其返回值型別,函式名字以及引數列表,其返回值型別與引數列表與普通的函式類似。
函式名字為:關鍵字operator後面接需要過載的運算子符號。
函式原型:返回值型別 operator操作符(引數列表)
1.過載運算子以後,不能改變運算子的優先順序、結合性、運算元個數
2.不能通過連線其他符號來建立新的操作符:比如operator@
3.過載操作符必須有乙個類型別或者列舉型別的運算元
4.用於內建型別的操作符,其含義不能改變,例如:內建的整型+,不 能改變其含義
5.作為類成員的過載函式時,其形參看起來比運算元數目少1成員函式的操作符有乙個預設的形參this,限定為第乙個形參
6.(.*) 、(::) 、(sizeof) 、(?:) 、(.) 以上5個括號內的運算子不能過載。
class date
//注意:這裡實際是bool operator==(date* this, const date& d2),左運算元是this指向的呼叫函式的物件
bool operator==( const date& d2)
private:
int _year;
int _month;
int _day;
};int main()
賦值運算子主要有四點:
1. 引數型別
2. 返回值
3. 檢測是否自己給自己賦值
4. 返回*this
class date
date(const date& d)
date& operator==(const date& d)
return *this;//返回左運算元
}private:
int _year;
int _month;
int _day;
};int main()
乙個類如果沒有顯式定義賦值運算子過載,編譯器也會生成乙個,完成物件按位元組序的值拷貝。
class date
private:
int _year;
int _month;
int _day;
};int main()
拷貝建構函式與過載賦值運算子
注意 該作者部落格已遷移至 如果乙個建構函式的第乙個引數是自身類型別的引用,且任何額外的引數都有預設值,則此建構函式是拷貝建構函式。c premier裡的定義 拷貝建構函式應用的場景 預設拷貝建構函式 class ctest ctest void test ctest obj intmain 這個程...
拷貝構造與過載賦值運算子
編譯器預設的拷貝建構函式,發生的是memberwise initialization 成員逐一初始化 類的成員變數被逐一複製。而預設賦值運算子,也是逐一複製成員變數。一旦成員變數中,有程式設計師在heap開闢的空間 指標,new 使用預設拷貝建構函式就會引起淺拷貝和深拷貝的問題。include us...
拷貝構造與賦值運算子過載(順序)
other l類型別 找到合適的建構函式生成該類的物件 如果找不到例項化物件失敗 隱式呼叫建構函式 顯示呼叫函式 無名物件 零時物件 賦值運算子過載函式 分為3步 第一步 判斷是不是自身賦值 防止失敗出錯 第二步 釋放this指標所指的 外部 空間的大小 第三步重新分配空間 拷貝資料 物件的生存週期...