建構函式、析構函式
、拷貝建構函式
如果類成員變數有初始值,用這些初始值初始化成員變數如果類成員變數沒有初始值,則預設初始化該成員變數
使用注意事項:class student ;
int main()
語法://這個預設建構函式之所以對student有效,是因為我們為內建型別的資料成員提供了初始值
//如果你的編譯器不支援類內初始值,那麼你的預設建構函式就應該使用建構函式初始值列表來初始化類的每個成員
class student
public:
int age = 18;
long id = 217060;
std::string name;};
int main()
注意事項class cat;
int main()
cat ocat();//不安全的初始化,可能會被誤認為宣告乙個函式
cat ocat; //安全的初始化
特點:
無論何時乙個物件被銷毀,就會自動呼叫其析構函式://退出區域性作用域時:對item、p2、vec呼叫析構函式
//銷毀p2會遞減其引用計數;如果其引用計數變為0,物件被釋放
class sales_data
int a;
string s;
}//sales_data類定義的物件被銷毀時,成員會被自動銷毀,其中string的析構函式會被呼叫
class sales_data
演示案例class cat
;cat::~cat()
}
class hasptr
~hasptr()
private:
std::string *ps;
int i;}
hasptr f(hasptr hp)
hasptr p("some values");
f(p);//當f結束時,p.ps指向的記憶體被釋放
hasptr q(p);//現在p和q都指向無效記憶體!
const:防止函式內部修改值&:防止無限迴圈拷貝類名(類名 const& 引數名)
//此類情況使用淺拷貝
class cperson
cperson::cperson(cperson const& other)
//此類含有指標的情況使用深拷貝
class cperson
cperson::cperson(cperson const& other)
else
this->name = null;
}int main()
每個成員的型別絕對了它如何被拷貝:
string dots(10,'.'); //直接初始化
string s(dots); //直接初始化
string s2=dots; //直接初始化
string null_book="9-999-99999-9";//拷貝初始化
string nines=string(100,'9'); //拷貝初始化
將乙個物件作為實參傳遞給乙個非引用型別的形參從乙個返回型別為非引用型別的函式返回乙個物件用花括號列表初始化乙個陣列中的元素或乙個聚合類中的成員
class sales_data
string null_book="9-999-9999-9"; //拷貝初始化
改寫為:
string null_book("9-999-9999-9"); //編譯器略過了拷貝建構函式
class cperson
;cperson& cperson::operator=(cperson const& other)
else//如果傳入的引數為空
C 建構函式 拷貝構造 析構函式
建構函式 constructor 在例項物件時,系統自動呼叫,用來初始化物件的資料成員 建構函式宣告語法 類名 引數列表 建構函式注意點 include include using namespace std class computer 上面的建構函式也可以寫成引數列表初始化的形式 compute...
建構函式 拷貝建構函式 析構函式
1.如果定義了兩個預設建構函式,vc只回給出warning.2.如果有預設引數的預設構造,如果你給了第乙個預設的話 所有傳遞引數都要有預設植 否則報錯.不過如果是第乙個引數的預設值沒有給出的話,編譯器卻看不出問題,但是沒有 試過這種情況建構函式能不能正常工作.建構函式 用來初始化物件的資料成員,與類...
c 建構函式,拷貝建構函式,析構函式小結
1 建構函式 乙個特殊的類成員函式,函式名與類名相同,建立類型別物件時,由編譯器自動呼叫,在物件的生命週期中隻且只呼叫一次,以保證每個資料成員都有乙個合適的初始值。有初始化階段與普通計算階段。class date date int year,int month,int day year year m...