BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #71861同步于 2013/6/17
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教有关空类的默认函数

lcb
2013/6/17镜像同步8 回复
有关空类的默认函数,目前有下面一些说法: C++的空类有哪些成员函数: . 缺省构造函数。 . 缺省拷贝构造函数。 . 缺省析构函数。 . 缺省赋值运算符。 . 缺省取址运算符。 . 缺省取址运算符 const。 注意:有些书上只是简单的介绍了前四个函数。没有提及后面这两个函数。但后面这两个函数也是空类的默认函数。另外需要注意的是,只有当实际使用这些函数的时候,编译器才会去定义它们。 一些网友反驳其正确性: 结合ISO/IEC 14882:2003(E)中12 Special member functions章节的描述,可以确定的是 默认构造函数 拷贝构造 析构 operator=是隐式声明的。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也认为上边的答案是有问题的。参考 Effective c++的勘误网站 点这里 下面是作者对于这个问题的解释: ! 2/10/00 ic 212 A class declaring no operator& function(s) 9/10/01 cxh 213 does NOT have them implicitly declared. Rather, 245 compilers use the built-in address-of operator 246 whenever "&" is applied to an object of that type. This behavior, in turn, is technically not an application of a global operator& function. Rather, it is a use of a built-in operator. 至此这个问题就很清晰了。 网上流传的答案估计是受Effective c++影响导致,所以现在大部分的网文和blog中对于此问题的答案都是错误。 于是,我做了下面的测试: class class2 { }; int main() { class2 obj1;//缺省构造函数 class2 obj2; obj1=obj2;//赋值运算符 //obj2.operator&(); &obj2;//取址运算符 class2 obj3(obj1);//拷贝构造函数 class2 const obj4; &obj4;//取址运算符 const return 0; } 上面代码是可运行的。 但是, //obj2.operator&(); &obj2;//取址运算符 这两句如果注释互换,编译说没有operator&函数。 想问问,这是个什么情况? 求大神指点。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
lcb机器人#1 · 2013/6/18
顶一下
a206206机器人#2 · 2013/6/18
fuck
lcb机器人#3 · 2013/6/18
再顶
binux机器人#4 · 2013/6/18
C/C++一天研究这个干嘛。。都准备写编译器吗? 你见过写python的谁天天研究对象实例的 __dict__,类属性,__getattr__ 的优先顺序吗?
tonyjansan机器人#5 · 2013/6/18
或许他们确实打算当编译达人吧~吼吼吼~ 【 在 binux 的大作中提到: 】 : C/C++一天研究这个干嘛。。都准备写编译器吗? : 你见过写python的谁天天研究对象实例的 __dict__,类属性,__getattr__ 的优先顺序吗?
gsl2011机器人#6 · 2013/6/25
我可以说,成功的那个就是普通的取址运算符么?
gsl2011机器人#7 · 2013/6/25
而且默认确实是没有的,标准里应该也只是说了四个。
LafengHu机器人#8 · 2013/6/27
怒顶! 【 在 binux 的大作中提到: 】 : C/C++一天研究这个干嘛。。都准备写编译器吗? : 你见过写python的谁天天研究对象实例的 __dict__,类属性,__getattr__ 的优先顺序吗?