effective C++ 条款 5:了解c++默认编写并调用那些函数
編譯給會為一個空類聲明一個default構造函數、一個copy構造函數、一個copy assignment操作符、和一個析構函數。所有這些都是public且inline:
class Empty{};
就像是寫了這樣的代碼:
class Empty{
??? Empty(){…}
??? Empty(const Empty& rhs) {…}
??? ~Empty(){…}
??? Empty& operator=(const Empty& rhs){…}
};
唯有當這些函數被需要,它們才會被編譯器創建出來。
default構造函數和析構函數,主要做些調用base classes和non-static成員變量的構造函數和析構函數。編譯器產出的析構函數是個non-virtual,除非這個class的base class自身聲明有virtual 析構函數(virtual屬性來自base class)。copy構造函數是以被拷貝的對象的成員變量為初值,構造自己的成員變量, 對于內置類型則是拷貝每一個bits來完成初始化。copy assignment操作符執行基本上和copy構造一樣。
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操作符。
轉載于:https://www.cnblogs.com/lidan/archive/2012/01/07/2315766.html
總結
以上是生活随笔為你收集整理的effective C++ 条款 5:了解c++默认编写并调用那些函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视频网站
- 下一篇: 《DB 查询分析器》中断SQL语句的执行