//=====================================================================
//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++
struct MyStruct
{
//無顯式的訪問修飾符,默認為public
int Value;
};
class MyClass
{
//無顯式的訪問修飾符,默認為private
int Value;
};
MyStruct myStruct;
myStruct.Value = 10;
MyClass myClass;
//因為Value為private,所以這個賦值語句出錯
myClass.Value = 10;
而訪問修飾符在struct和class的差異在C#中根本就不存在,因為在C#中無論是struct還是class,訪問修飾符默認的都是private。
C++中struct和class還有個區別是,struct支持初始化列表,而class不支持,如下代碼所示:
//C++
MyStruct myStruct = {10};
//因為class不支持初始化列表,所以這行語句編譯出錯
MyClass myClass = {10};
直接給對象進行初始化列表賦值的話,那麼編譯器會報錯:error C2552: myClass : non-aggregates cannot be initialized with initializer list。
說了那麼多C++的區別,但這沒有一個是對應上C#的,那是不是可以斷言,C#的struct等同於class?當然不是。在C#中,struct是值類型,而class是引用類型。而這個類型的不同,直接影響到"="賦值操作符。我們來看一段具體的代碼:
//C#
struct MyStruct
{
public int Value;
};
class MyClass
{
public int Value;
};
static void Main(string[] args)
{
MyStruct myStruct1 = new MyStruct();
MyStruct myStruct2 = myStruct1;
myStruct1.Value = 10;
myStruct2.Value = 20;
Console.WriteLine("myStruct1.Value = {0}", myStruct1.Value);
Console.WriteLine("myStruct2.Value = {0}", myStruct2.Value);
MyClass myClass1 = new MyClass();
MyClass myClass2 = myClass1;
myClass1.Value = 10;
myClass2.Value = 20;
Console.WriteLine("myClass1.Value = {0}", myClass1.Value);
Console.WriteLine("myClass2.Value = {0}", myClass2.Value);
}
該段代碼的輸出結果如下:
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一致。