前几天刚读完深度探索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析构函数不定义的话,链接时会报错,因为子类的析构函数默认需要调用父类的析构函数,即使父类的析构函数是一个纯虚析构函数。