C++中聲明和定義的區別

來源:互聯網
上載者:User

CSDN裡用人問:

我一直以為定義=聲明+初始化,即int i;是聲明,int i =0;是定義。
但看侯捷翻譯的Effective C++上面說string ps;也是個定義(在條款定義應該盡量靠後的那節),如果定義過早,就會過早引入構造的負擔。
難道我對聲明和定義的概念一直有錯嗎
聲明不導致記憶體配置,那麼到底如何區分定義和聲明?

我在樓下回帖裡挑選了幾個比較靠譜的答案進行了一下總結,以防以後自己也忘了。

"聲明"的嚴謹C++語意,是用以告訴編譯器類型及其細節,例如:

class MyClass
{
  //資料成員細節...
  //成員函數細節...
};

上述聲明僅告訴編譯器有自訂類型MyClass,編譯器僅對其進行語彙分析及名字的決議,並未佔用記憶體!

"定義"的嚴謹C++語意,即記憶體佔有,編譯器將在相對記憶體位址上為其對象定址!

要注意的是,我們不能簡單的說

string myString;  

是聲明還是定義,判斷的原則是看是否佔用記憶體。例如:

class MyClass //類的聲明,無記憶體佔有{  string myString; //string的聲明};

但是

#include<iostream>
 
//全域範圍
string myString;//定義,myString是執行個體化的string!
 
int main()
{
  //Main函數體內
  string myAnotherString;//定義,myAnotherString是執行個體化的string!
  return 0;
}

所以有回複說:

變數和對象不加extern永遠是定義,類中的除外。

函數只有函數頭是聲明,有函數體的是定義。

類永遠只是聲明。類成員函數的函數體是定義。

class MyClass
{
    static int x; //這裡的x是聲明
    static const int a; //這裡的a是聲明
    //非static變數在類執行個體化時才分配記憶體.
    MyClass();//這裡的函數是聲明
};
int MyClass::x;//這是定義
const int MyClass::a=11;//這是定義

到底是怎麼區分呢?還望高手解答。

原帖:猛擊這裡!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.