ex1:
1,拷貝建構函式的定義:
乙個建構函式的第乙個引數是自身型別的引用,且任何額外引數都有預設值。2,出現場合: ex2:
拷貝建構函式自己的引數必須是引用型別。因為如果不是的話,在呼叫拷貝建構函式時,將乙個物件作為實參傳遞給乙個非引用型別的形參時,會再次呼叫該拷貝建構函式陷入死迴圈。
ex5
hasptr(const
string &hp)
一般拷貝賦值運算子組合了析構函式和建構函式的工作:好的使用方法是:先將右側運算物件特殊成員(如指標)儲存到區域性臨時變數中,然後銷毀左側運算物件的需要顯示銷毀的成員(如指標)(為了防止自賦值,先後順序不能變),再將臨時物件賦值。(參考ex22)ex6
作用:控制物件的賦值.。注意:返回值為左側運算物件的引用。
ex7???
ex8
指向乙個物件的指標或引用離開作用域時,析構函式不會執行ex9
作用:釋放物件使用的資源,並銷毀物件的非static資料成員
ex10???
ex11
~hasptr()
ex13#include
#include
#include
struct x
x(const x&)
x& operator=(const x&)
~x()
};void f(const x &rx, x x)//構
int main()
順序:構構析構構析析析 –》 構構構構析析析析
需要析構函式則也需要拷貝和賦值函式。需要拷貝函式則需要建構函式,反之亦然。
??? iostream類阻止拷貝ex18,19???p451 第三段
employee
employee(string str):name(str)
employee(const employee& e)= delete;
emplyee& operator=(const employee& e)=delete;
}int employee::flag = 0;
在現實生活中拷貝或者賦值員工的個人資訊沒有實際意義。
ex20,21???
ex22
class hasptr
hasptr(const hasptr& hp)
haspre& operator=(const hasptr& hp)
~hasptr()
}
ex25,26???
class
hasptr
hasptr(const hasptr& hp):ps(hp.ps),i(hp.i),use(hp.use)
haspre& operator=(const hasptr& hp)//如果無指標指向左側運算物件,則釋放空間
ps = hp.ps;
i = hp.i;
use = hp.use;
return *this;
}~hasptr()
}}
13.28???
13.32
#include
#include
#include
#include
using
namespace
std;
class hasptr
hasptr(const hasptr &hp)
: ps(new
std::string(*hp.ps)), i(hp.i)
hasptr& operator=(hasptr tmp)
void display()
~hasptr()
void swap(hasptr &rhs)
void show() const
private:
std::string *ps;
int i;
};void swap(hasptr& lhs, hasptr& rhs)
bool
operator
<(const hasptr &lhs, const hasptr &rhs)
int main()
}
第13章 拷貝控制
拷貝建構函式class foo sales data sales data const sales data orig bookno orig.bookno units sold orig.units sold revenue orig.revenue 拷貝賦值運算子foo operator con...
第13章 拷貝控制
拷貝構造的第乙個引數是自身類型別的引用,且任何額外引數都有預設值,成為拷貝建構函式。拷貝建構函式通常不應該是explicit,可以接受非const引用。class foo 合成拷貝建構函式 編譯器會自動合成拷貝建構函式。一般情況中,合成的拷貝建構函式會將其引數的成員逐個拷貝到正在建立的物件中。編譯器...
13 拷貝控制
拷貝控制 一些特殊的情況使用拷貝初始化 但是使用emplace建立的元素都進行直接初始化 在函式呼叫的過程中,具有非引用型別的引數要執行拷貝初始化,當函式具有乙個非引用的返回值型別時,返回值用來初始化呼叫方的結果 這樣來總結一下直接初始化和拷貝初始化 當建構函式只有乙個形參時,就有一套預設的隱式轉換...