Know want functions C++ silently writes and calls
第二章的前几节都比较短,书中说明的问题,如果说读者读过其他的高质量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;
}
我们会得到以下的错误
Call to implicitly-deleted default constructor of 'People'
调用“People”的隐式删除的默认构造函数
Object of type 'People' cannot be assigned because its copy assignment operator is implicitly deleted
无法分配“People”类型的对象,因为它的复制赋值运算符被隐式删除
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;
};
如果我们试着创建一个对象,那么我们就会得到这样的一个错误。
Call to implicitly-deleted default constructor of 'Student'
调用“Student”的隐式删除的默认构造函数
这种时候就需要程序员手动的为类添加对应的函数了。
笔者注:在C++11标准之前,将构造函数声明为private等同于C++11增加了将其声明为delete的 *** 作,即
People() = delete;
现在,如果仅仅希望不以任何形式调用构造函数,请使用C++11提供的方法。
请记住
编译器可以案子为class创建deauflt构造函数、copy构造函数、copy assignment *** 作符,以及析构函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)