程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 空類默認隱式聲明的成員函數

空類默認隱式聲明的成員函數

編輯:關於C語言

 最近在論壇上發現的問題,改變了我以前在這方面的錯誤看法,跟大家分享一下。
據說這個問題在面試中被問到的機率比較高,幸運的是我好像沒有碰到過。
一般流行的看法是:

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博客

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved