最近在論壇上發現的問題,改變了我以前在這方面的錯誤看法,跟大家分享一下。
據說這個問題在面試中被問到的機率比較高,幸運的是我好像沒有碰到過。
一般流行的看法是:
class Empty{};
相當於:
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也認為上邊的答案是有問題的。
下面是作者對於這個問題的解釋:
! 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.
至此相信讀者心中已經有答案了吧。
摘自 姜亞風CSDN博客