读书人

分享俺的一个关于?C++中的空类编译器默

发布时间: 2012-02-21 16:26:23 作者: rapoo

分享俺的一个关于?C++中的空类编译器默认隐式声明哪些成员函数?的问题重大认识~~~~~~~~~~
这个问题面试题出现的概率比较高。通常比较流行的答案是

C/C++ code
class Empty{}; 


就相当于:

C/C++ code
class 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++就是强大!!!
[解决办法]
很好嘛

读书人网 >C++

热点推荐