• 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操作符

  • 相关阅读:
    html实现 省——市——区三级联动
    test
    JAVA课程设计——坦克大战
    Java MOOC-互评作业-流与文件
    DS博客作业06--图
    DS博客作业08--课程总结
    DS博客作业07--查找
    DS博客作业06--图
    DS博客作业05-树
    DS博客作业01--日期抽象数据类型设计与实现
  • 原文地址:https://www.cnblogs.com/lidan/p/2315766.html
Copyright © 2020-2023  润新知