程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ VS C#(11):結構體和對象的細微區別

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

編輯:C++入門知識

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

 

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