分享俺的一个关于?C++中的空类编译器默认隐式声明哪些成员函数?的问题重大认识~~~~~~~~~~这个问题面试题出
分享俺的一个关于?C++中的空类编译器默认隐式声明哪些成员函数?的问题重大认识~~~~~~~~~~ 这个问题面试题出现的概率比较高。通常比较流行的答案是
C/C++ codeclass Empty{}; 就相当于:
C/C++ codeclass Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(const Empty& rhs); Empty* operator&(); const Empty* operator&() 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中对于此问题的答案都是错误。
[解决办法] 我的effective C++没有提到Empty* operator&(); // 取址运算符
我的是第三版
[解决办法] 好的,支持。
[解决办法] 我想知道为什么没有,测试代码我都不只用怎么写
[解决办法] 谢谢
[解决办法] 探讨 引用: 坐sf支持楼主~~ 鉴于网上的流传的很多都是错误的答案,为让更多的人纠正错误,所以 求推荐[解决办法] iso好厚
[解决办法] 到底哪些是...
[解决办法] 探讨 class Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(const Empty& rhs); } 就这4个是隐式声明的。新版的Effective C++的以加以纠正了。[解决办法] SOGA...但是推荐这个有点。。。。
[解决办法] [解决办法] [解决办法] 顶!~~~~~~~~[解决办法] C++就是有点儿"乱"![解决办法] heavily supporting for your work![解决办法] 这2个写法 Test()=a; A*p=&Test(); 不太懂,想了解一下,但不知 参考(3.10 Lvalues and rvalues )在那能找到,兄弟可以说一下否[解决办法] 丰富的语法规则丰富的使用方法必然乱……[解决办法] 不明白表达的是什么[解决办法] class Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(const Empty& rhs); Empty* operator&(); const Empty* operator&() const; };[解决办法] 不错![解决办法] 支持下[解决办法]
探讨 引用: 不明白表达的是什么 简而言之c++一个空类,c++会隐式声明如下成员函数: class Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(const Empty& rhs); }; 网上很多……[解决办法] 看着就晕啊。。。。。。。
[解决办法] 空类的用途是?
[解决办法] 看着眼晕
[解决办法] 新手的新手。先记下来了
[解决办法] 探讨 引用: 引用: 坐sf支持楼主~~ 鉴于网上的流传的很多都是错误的答案,为让更多的人纠正错误,所以 求推荐 越权推荐了,希望Loaden和mstlq别打我[解决办法] 现在面试还是扣这些细节吗?好多年没换工作了。
[解决办法] 是的
探讨 引用: 引用: 不明白表达的是什么 简而言之c++一个空类,c++会隐式声明如下成员函数: class Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(cons……[解决办法] 接分
[解决办法] 非常好,最好让更多人看到
[解决办法] 谢谢LZ的劳动……
[解决办法] [解决办法] [解决办法] 谢谢分享~~
------解决方案--------------------
饱受C++的同学进来凑下热闹!
[解决办法] 看C++对象模型 那里有说
[解决办法] 来接分 , 同时大赞楼主的专研和分享精神!
[解决办法] 楼主很细心,向楼主学习这种治学态度.
[解决办法] [解决办法] 看看《深度解析C++对象模型》就知道了,感觉C++功能需要扩张,但概念需要简化,整个C++语言充斥着某几个牛人的编程哲学观,但对于很多初学者来说这个复杂度是个灾难。
[解决办法] 不错,学习了。。。。
[解决办法] 探讨 现在面试还是扣这些细节吗?好多年没换工作了。[解决办法] 楼主拿这么老的东西出来说感觉有点误人子弟啊,第一次看到重载取值操作符的。
一般人都不会看《Effective C++》第二版了吧,1997年的书,第三版都出5年了。
[解决办法] 探讨 曾经在论坛遇到类似的代码: C/C++ code struct A { }; A Test() { return A(); } int main() { A a; Test()=a; A*p=&Test(); } Test()=a;这一句c++标准是允许的。参考(3.10 Lvalues and rvalues 第2条款 角注47的相关描述……[解决办法] 探讨 引用: 引用: 不明白表达的是什么 简而言之c++一个空类,c++会隐式声明如下成员函数: class Empty { public: Empty(); Empty(const Empty&); ~Empty(); Empty& operator=(con……[解决办法] C++好难
[解决办法] 说得不错,这么高级的错误也被楼主发现了
[解决办法] 不错哟
[解决办法] 其实这是个十分无聊的问题。没实际意义。
[解决办法] 不错哟
[解决办法] C++就是强大!!!
[解决办法] 很好嘛