effective C++ 条款 5:了解c++默认编写并调用那些函数
編譯給會為一個空類聲明一個default構(gòu)造函數(shù)、一個copy構(gòu)造函數(shù)、一個copy assignment操作符、和一個析構(gòu)函數(shù)。所有這些都是public且inline:
class Empty{};
就像是寫了這樣的代碼:
class Empty{
??? Empty(){…}
??? Empty(const Empty& rhs) {…}
??? ~Empty(){…}
??? Empty& operator=(const Empty& rhs){…}
};
唯有當(dāng)這些函數(shù)被需要,它們才會被編譯器創(chuàng)建出來。
default構(gòu)造函數(shù)和析構(gòu)函數(shù),主要做些調(diào)用base classes和non-static成員變量的構(gòu)造函數(shù)和析構(gòu)函數(shù)。編譯器產(chǎn)出的析構(gòu)函數(shù)是個non-virtual,除非這個class的base class自身聲明有virtual 析構(gòu)函數(shù)(virtual屬性來自base class)。copy構(gòu)造函數(shù)是以被拷貝的對象的成員變量為初值,構(gòu)造自己的成員變量, 對于內(nèi)置類型則是拷貝每一個bits來完成初始化。copy assignment操作符執(zhí)行基本上和copy構(gòu)造一樣。
class NameObject{
public:
??? NameObject(std::string& name, const int& value);
private:
??? std::string& nameValue;
??? const int objectValue;
};
inline void test05()
{
??? std::string newDog("Persephone");
??? std::string oleDog("Satch");
??? NameObject p(newDog, 2);
??? NameObject s(oleDog, 36);
//??? p = s;?????? //error C2582: 'NameObject' : 'operator =' function is unavailable
}
c++不允許讓reference改指向不同對象,而且不能更改const對象。所以編譯器生成的copy assignment操作符無能為力, 如果想賦值只能自己定義copy assignment操作符了。
如果base classes將copy assignment操作符聲明為private, 編譯器將拒絕為其derived classes生成一個copy assignment操作符。
轉(zhuǎn)載于:https://www.cnblogs.com/lidan/archive/2012/01/07/2315766.html
總結(jié)
以上是生活随笔為你收集整理的effective C++ 条款 5:了解c++默认编写并调用那些函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频网站
- 下一篇: QTP简单框架(6)之脚本编写实例