第二章的前几节都比较短,书中说明的问题,如果说读者读过其他的高质量C++教学书籍的化可能都会提到,因此,前几篇中,我会以简短的语言去描述。
如果说我们仅仅实现了一个空类,也就是说类定义中没有任何的语句。那么这个类中就什么也没有吗?
不,C++默认为我们提供了一些函数,他们都是public并且inline的,。
一个默认构造函数,一个默认析构函数(不是virtual的),为空实现,就是函数语句块中任何代码也没有。他们接受的参数为空。如果你提供一个任何形式的构造函数或者析构函数,那么编译器就不会再提供对应的构造函数或者析构函数。
一个copy构造函数。 一个copy assignment也就是拷贝赋值运算符,都没有深拷贝,仅仅是成员的复制。
关于编译器生成的有关copy函数如何履行职责,读者再其他的C++读物中应该看到过,这里简单的概括以下——对于自定义类型,会调用对应的构造函数,对于内置类型,拷贝每一位bits。
一般而言只有当编译器产出的代码合法且有适当机会证明它有意义,其才会生成对应的代码。万一两个条件有一个不符合,编译器会拒绝为class产出代码。 不符合的情况有这样。
1.类成员内含引用——引用一旦绑定对象就不能再绑定别的对象。
2.类成员含const修饰——const一旦被初始化就不能再该变。
3.父类整的构造函数被声明为private。
我们翻过编译器为我们生成的有关copy的函数,其行为只是单一的copy。所以,对于1,改动引用时不合法的。对于2,不能再对const赋值。对于3,结合继承的知识来看,父类的构造函数不能被子类调用——子类的构造恰恰又需要调用父类中的构造函数。
我们可以看一下具体的代码。
class People
{
private:
string & name;
const int age;
public:
People() = default;
};
int main()
{
People p1;
People p3;
People p2(p1);
p3 = p1;
return 0;
}
我们会得到以下的错误
class People
{
public:
string name;
int age;
private:
People(const string& _name, const int _age) : name(_name), age(_age) { }
};
class Student : public People
{
private:
int grade;
};
如果我们试着创建一个对象,那么我们就会得到这样的一个错误。
这种时候就需要程序员手动的为类添加对应的函数了。
请记住