zoukankan      html  css  js  c++  java
  • effective C++ 条款 5:了解c++默认编写并调用那些函数

    编译给会为一个空类声明一个default构造函数、一个copy构造函数、一个copy assignment操作符、和一个析构函数。所有这些都是public且inline:

    class Empty{};

    就像是写了这样的代码:

    class Empty{

        Empty(){…}

        Empty(const Empty& rhs) {…}

        ~Empty(){…}

        Empty& operator=(const Empty& rhs){…}

    };

    唯有当这些函数被需要,它们才会被编译器创建出来。

    default构造函数和析构函数,主要做些调用base classes和non-static成员变量的构造函数和析构函数。编译器产出的析构函数是个non-virtual,除非这个class的base class自身声明有virtual 析构函数(virtual属性来自base class)。copy构造函数是以被拷贝的对象的成员变量为初值,构造自己的成员变量, 对于内置类型则是拷贝每一个bits来完成初始化。copy assignment操作符执行基本上和copy构造一样。

    class NameObject{
    public:
        NameObject(std::string& name, const int& value);
    private:
        std::string& nameValue;
        const int objectValue;
    };

    inline void test05()
    {
        std::string newDog("Persephone");
        std::string oleDog("Satch");
        NameObject p(newDog, 2);
        NameObject s(oleDog, 36);

    //    p = s;       //error C2582: 'NameObject' : 'operator =' function is unavailable
    }

    c++不允许让reference改指向不同对象,而且不能更改const对象。所以编译器生成的copy assignment操作符无能为力, 如果想赋值只能自己定义copy assignment操作符了。

    如果base classes将copy assignment操作符声明为private编译器将拒绝为其derived classes生成一个copy assignment操作符

  • 相关阅读:
    修改服务器时间及时区
    风情万种awk
    追忆似水流年sed
    lvm笔记
    正则不怎么会用
    在CentOS7.5的虚拟环境下新建你的django项目
    Django学习过程中的排错总结
    我一直记不住的vim用法
    关于自建yum源拾遗
    Djangp2.x版本报错找不到模版目录下的文件
  • 原文地址:https://www.cnblogs.com/lidan/p/2315766.html
Copyright © 2011-2022 走看看