zoukankan      html  css  js  c++  java
  • C++中的空类编译器默认隐式声明哪些成员函数【CSDN】

    View Code
    class Empty 
    {
    public:
    Empty();
    Empty(const Empty&);
    ~Empty();
    Empty& operator=(const Empty& rhs);
    Empty* operator&();
    const Empty* operator&() const;
    };


    让我不解的是网上为何流传上述的答案,而且我隐约记着在哪本本权威的书上看到这个说法的,最近偶然翻了一下
    侯捷翻译的中文简体《Effective c++, 2nd》 这本书终于找到了答案:

    条款45: 弄清C++在幕后为你所写、所调用的函数

    一个空类什么时候不是空类? ---- 当C++编译器通过它的时候。如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。换句话说,如果你这么写:

    class Empty{};

    和你这么写是一样的:

    class Empty {
    public:
    Empty(); // 缺省构造函数
    Empty(const Empty& rhs); // 拷贝构造函数

    ~Empty(); // 析构函数 ---- 是否
    // 为虚函数看下文说明
    Empty&
    operator=(const Empty& rhs); // 赋值运算符

    Empty* operator&(); // 取址运算符
    const Empty* operator&() const;
    };
    对于这个问题,早有读者向书的作者Scott Meyers提出了疑问,Scott Meyers也认为上边的答案是有问题的


    正解:

    class Empty
    {
    public:
    Empty();
    Empty(const Empty&);
    ~Empty();
    Empty& operator=(const Empty& rhs);
    }
  • 相关阅读:
    二叉树层次遍历
    链表
    线段树加离散化
    前缀和
    RMQ(Range MinimumQuery)问题之ST算法
    2016"百度之星"
    2016"百度之星"
    Dragon Balls[HDU3635]
    Building Block[HDU2818]
    Dogs[HDU2822]
  • 原文地址:https://www.cnblogs.com/guyan/p/2294148.html
Copyright © 2011-2022 走看看