C++ VS C#(11):結構體和對象的細微區別

來源:互聯網
上載者:User

//=====================================================================
//TITLE:
//    C++ VS C#(11):結構體和對象的細微區別
//AUTHOR:
//    norains
//DATE:
//    Friday  18-January-2011
//Environment:
//    Visual Studio 2010
//    Visual Studio 2005
//=====================================================================

 

1. 結構體和對象的細微區別

 

  struct(結構體)是C遺留下來的玩意,既然C++和C#都和C有著那麼不一般的關係,自然也繼承了這個血統。既然又打著物件導向的旗號,自然也有所創新,也就有了class(類),而類的執行個體化又有了對象。
  
   那麼struct和class是不是兩樣不同的東西呢?答案不能簡單說是或否,因為其實這兩者關係還蠻大的。在C++中,struct和class其實就是一個玩意,唯一不同的是,成員如果沒有存取修飾詞的時候,struct預設的是public,class的則是private!如果以代碼的方式,可能大家更容易明白,如下所示:
//C++<br /> struct MyStruct<br /> {<br /> //無顯式的存取修飾詞,預設為public<br /> int Value;<br /> };</p><p> class MyClass<br /> {<br /> //無顯式的存取修飾詞,預設為private<br /> int Value;<br /> };</p><p> MyStruct myStruct;<br /> myStruct.Value = 10;</p><p> MyClass myClass;<br /> //因為Value為private,所以這個指派陳述式出錯<br /> myClass.Value = 10;<br />  

   而存取修飾詞在struct和class的差異在C#中根本就不存在,因為在C#中無論是struct還是class,存取修飾詞預設的都是private。
  
  
   C++中struct和class還有個區別是,struct支援初始化列表,而class不支援,如下代碼所示:
//C++<br /> MyStruct myStruct = {10};</p><p> //因為class不支援初始化列表,所以這行語句編譯出錯<br /> MyClass myClass = {10}; 
   
   直接給對象進行初始化列表賦值的話,那麼編譯器會報錯:error C2552: 'myClass' : non-aggregates cannot be initialized with initializer list。
  
  
   說了那麼多C++的區別,但這沒有一個是對應上C#的,那是不是可以斷言,C#的struct等同於class?當然不是。在C#中,struct是實值型別,而class是參考型別。而這個類型的不同,直接影響到"="賦值操作符。我們來看一段具體的代碼:

//C#<br /> struct MyStruct<br /> {<br /> public int Value;<br /> };</p><p> class MyClass<br /> {<br /> public int Value;<br /> };</p><p> static void Main(string[] args)<br /> {<br /> MyStruct myStruct1 = new MyStruct();<br /> MyStruct myStruct2 = myStruct1;<br /> myStruct1.Value = 10;<br /> myStruct2.Value = 20;<br /> Console.WriteLine("myStruct1.Value = {0}", myStruct1.Value);<br /> Console.WriteLine("myStruct2.Value = {0}", myStruct2.Value);</p><p> MyClass myClass1 = new MyClass();<br /> MyClass myClass2 = myClass1;<br /> myClass1.Value = 10;<br /> myClass2.Value = 20;<br /> Console.WriteLine("myClass1.Value = {0}", myClass1.Value);<br /> Console.WriteLine("myClass2.Value = {0}", myClass2.Value);<br /> }<br />  

   該段代碼的輸出結果如下:
   myStruct1.Value = 10
   myStruct2.Value = 20
   myClass1.Value = 20
   myClass2.Value = 20

  
   從結果中可以看出,類的"="就相當於指標賦值,MyClass myClass2 = myClass1語句完全可以認為是將myClass1的地址賦值給myClass2,所以對myClass2的任何更改都會反映到myClass1之中。而struct的"="操作,就是簡單的賦值操作,也就是將myStruct1.Value複製給myStruct2.Value而已,對myStruct2的任何操作都不會影響到myStruct1。
  
   struct和class的"="的區別,在C++中根本不存在。無論是struct還是class,C++中的"="都是賦值操作,也就是和C#的struct一致。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.