//=====================================================================
//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一致。