条款5 了解C++默默编写并调用哪些函数

1.empty class 在C++处理过后就不再是一个empty class.编译器会为它声明一个copy 构造函数,一个copy assignment操作符,一个析构函数。此外你如果你没有声明任何构造函数,编译器也会为你声明一个default构造函数。所有这些函数都是Public且inline。

所以:

class Empty{};

就如同:

class Empty{ public: Empty(){...} Empty(const Empty& rhs) {...} ~Empty() {....} Empty& operator=(const Empty& rhs) {...} };

 

 

唯有当这些函数被调用,它们才会被编译器创建出来。

 

Empty e1; //default 构造函数 //析构函数 Empty e2(e1); //copy 构造函数 e2 = e1; //copy assignment操作符

 

2.default构造函数和析构函数主要是给编译器一个地方用来放置“藏身幕后”的代码。编译器产出的析构函数是个non-virtual。除非这个class的base class 自身声明有virtual 析构函数。

 

3.copy构造函数和copy assignment操作符,编译器创建的版本只是单纯的将来源对象的每个non-static成员变量拷贝到目标对象。

 

4.copy assignment操作符,其行为基本上与copy构造函数一致,但一般而言,只有当生出的代码合发且有适当机会证明它有意义,其表现才如上所述。万一两个条件一个不符合,编译器会拒绝为class生出operator=。

 

template<typename T> class NamedObject{ public: NameObject(const char* name, const T& value); NamedObject(const std::string& name, const T&value); ... private: std::string nameValue; T objectValue; } //然后是使用 NamedObject<int> no1("Smallest Prime Number", 2); NamedObject<int> no2(no1); //但是,要是这样就不行 template<class T> class NamedObject{ public: NamedObject(std::string& name, const T& value); .... private: std::string& nameValue; const T objectValue; } ///如果遇上下面的事 std::string newDog("Persephone"); std::string oldDog("Satch"); NamedObject<int> p(newDog, 2); NamedObject<int> s(oldDog, 36); p = s; //reference 改指向不同对象是不被允许的,而且还企图更改const. //所以这是不行的

 

 

编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment操作符,以及析构函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值