Effective C++ --读书笔记之一

前几天刚读完深度探索C++对象模型,短短的300页,看完了之后,明白了很多东西,同时也有很多新的疑惑,对之前的一些C++的看法,多少有点颠覆。决定在读读Effective C++系列,然后再回头看看深度探索。

每天看一些,希望在这里记录一些有疑惑的地方:

1.什么情况下,编译器拒绝自动为class创建 copy assignment operator?

类中含有 reference成员,含有const成员,或者该类的base class中的copy assignment operator是private的,以上三种情况,编译器都拒绝为类创建默认的赋值操作符重载函数。对于前面两种,显而易见,引用成员和const成员,都必须初始化,而且初始化后是不能再被赋值的,因此类的这两种non static成员,必须在构造函数初始化列表中被初始化。对于第三种情况,默认的编译器自定义的copy assignment operator是会自动调用base class的copy assignment operator的,因此,如果base class中对应的赋值操作符重载函数是private的,子类是没有访问权限的,自然会导致编译错误。

 

2. Pure Virtual Function纯虚函数是否可以定义,而不仅仅是声明?

由于C++程序写的少,使用道Pure virtual function的机会就更少了,看到的很多例子,也都是在类内部的纯虚函数声明的地方,在参数列表的最后加上=0,表示该函数是一个纯虚函数,需要子类重写该函数。印象中一直以为,这样,我就不可以在该类中给纯虚函数添加定义了。今天才发现,这个想法大错特错,一个类中给纯虚函数添加定义,是非常合法的,而且对于纯虚的析构函数而言,一般来说,你必须得给它添加定义,否则可能会引起子类的编译无法正确通过。在Visual C++上,自己写了个例子,试了一下,果然如此。

using namespace std;

class base_t
{
public:
    virtual ~base_t() = 0;
};

base_t::~base_t()
{
}

class drivied_t : public base_t
{
    //public:
    //    ~drivied_t(){}

};

void main(void)
{
    drivied_t d;
}

上面这段例子中,如果base_t::~base_t析构函数不定义的话,链接时会报错,因为子类的析构函数默认需要调用父类的析构函数,即使父类的析构函数是一个纯虚析构函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值