0
点赞
收藏
分享

微信扫一扫

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

        第二章的前几节都比较短,书中说明的问题,如果说读者读过其他的高质量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;
};

如果我们试着创建一个对象,那么我们就会得到这样的一个错误。

         这种时候就需要程序员手动的为类添加对应的函数了。

请记住

举报

相关推荐

0 条评论