Effective C++——条款05:了解C++默默编写并调用哪些函数

Effective C++——条款05:了解C++默默编写并调用哪些函数,第1张

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 *** 作符,以及析构函数。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/565167.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存