Effective C++ 条款5~7

条款5. 认知c++默认提供的类函数
如果你只是声明一个empty class ,c++编译器也会默认提供四个函数

class Empty{
public:
    Empty();
    Empty(const Empty& rhs);
    ~Empty();

    Empty& operator=(const Empty& rhs);
}
//defult构造函数    如果你已经定义一个新的构造函数,则不会提供default
//copy构造函数
//析构函数
//copy assignment操作符
//注意区分:
每次存在新对象的构造时则调用copy构造函数:Empty e2(e1) ; 或者 Empty e2 = e1;
而对于已经存在的对象这调用copy assignment: Empty e3; e3 = e1;
/*
注:
何时编译器不会提供默认重载的operator= ?  思考下为什么?
1.class 成员变量是reference  //C++reference不允许reference指向不同对象
或者:
2.class 成员变量存在const修饰
==》 这时候需要我们重新定义operator = 的函数

-

条款6.如果不想使用编译器自动生成的函数则需要明确拒绝

目的: 阻止class实例被再一次复制 
解决: 私有化copy构造和operator=

class HomeForSale{
public:
private:
    ;//在private中 仅仅声明 copy构造和赋值运算符
    HomeForSale(const HomeForSale& );
    HomeForSale& operator=(const HomeForSale&);
}
/*
注释:
但是类的friend函数 member函数仍然可以调用private,如果使用了它们,那么在编译期间将会得到linkage error    ===》   这里我不太明白 为什么会报错呢?

book P39
*/

-

条款7.多态基类声明virtual析构函数

如果对多态的机制有所了解的话,我们很容易的知道virtual 析构函数的目的。
目的: delete pointer时出现局部销毁的情况,只把基类的成分销毁,从而导致资源泄漏
其他:
vptr virtual table pointer
vtbl virtual table ====》 book P42

使用case1.带有多态 polymorphic的base class 需要声明virtual 析构函数。此外如果class 带有任何virtual函数,也应该拥有virtual析构函数
2.如果class的设计目的不是为了作为base class 或者 不是为了具备多态性,就不应该声明为virtual函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值