從C到C++——結構體(struct)的涅槃

從C到C++,結構體(struct)涅槃重生,那麼,C語言的結構體和C++結構體有什麼不一樣呢,下面是一個測試程序,程序中大量的註釋就算做本文的講解吧!ios

 

/*- ==========================================================
*     文件名  :TestCppStruct.cpp
*     開發人員:袁培榮
*     當前版本:1.0.0.2595
*     建立時間:2012-05-17
*     修改時間:2012-05-17
*     功能說明:C++結構體功能測試
*     版權說明:版權全部 袁培榮 YuanPeirong 
*     編譯環境:Windows 7(x64) SP1 簡體中文專業版
*     編譯器:  Visual Studio 2010 SP1(中文旗艦版)
                MinGW 20111108
                Visual C++ 6.0 SP6(中文企業版)
- ==========================================================*/

#include <iostream>
using std::cout;
using std::endl;

//====================================================================
struct STest
{
    int a;
    char c;
    STest()
    {
        cout<<"STest結構體構造函數被執行"<<endl;
        a=10;
        c='S';
    };
};
//====================================================================
struct STest2
{
    int a;
    char c;
    STest2();
};

STest2::STest2()
{
    cout<<"STest2結構體構造函數被執行"<<endl;
    a=15;
    c='T';
}
//====================================================================
struct STest3
{
    int a;
    char c;
    void Test()
    {
        cout<<"STest3結構體Test函數被執行"<<endl;
        a=10;
        c='S';
    };
};
//====================================================================
struct STest4
{
    int a;
    char c;
    void Test();
};

void STest4::Test()
{
    cout<<"STest4結構體Test函數被執行"<<endl;
    a=15;
    c='T';
}
//====================================================================
struct STest5
{
    int a;
    void Test();
private:
    char c;
    void Test2();
    
};

void STest5::Test()
{
    cout<<"STest5結構體Test函數被執行"<<endl;
    a=16;
    c='X';
}

void STest5::Test2()
{
    cout<<"STest5結構體Test2函數被執行"<<endl;
    a=17;
    c='Y';
}
//====================================================================
int main(int argc, char* argv[])
{
    //====================================================================
    STest s11;  //在C語言中應爲 struct STest s11;  在C++中struct可省略
    STest2 s21; //
    cout<<"s11: "<<s11.a<<" "<<s11.c<<endl;
    cout<<"s21: "<<s21.a<<" "<<s21.c<<endl;
    s11.a=100;
    s21.c='Z';
    cout<<"直接修改了s11和s21的值!"<<endl;
    cout<<"s11: "<<s11.a<<" "<<s11.c<<endl;
    cout<<"s21: "<<s21.a<<" "<<s21.c<<endl;
    //====================================================================
    // C++的結構體有構造函數,C語言中結構體不能有函數,更別談構造函數
    //====================================================================
    
    //====================================================================
    // STest s12={1,'A'};
    // STest s22={2,'B'};
    // cout<<"s12: "<<s12.a<<" "<<s12.c<<endl;
    // cout<<"s22: "<<s22.a<<" "<<s22.c<<endl;
    //====================================================================
    // error: `s12' must be initialized by constructor, not by `{...}'
    // error: `s22' must be initialized by constructor, not by `{...}'
    // 結構體一旦有構造函數就不能經過 {...} 方式初始化
    //====================================================================
    
    //====================================================================
    STest3 s31={1,'A'};
    STest4 s41={2,'B'};
    cout<<"經過 {...} 方式初始化 了s31和s41的值"<<endl;
    cout<<"s31: "<<s31.a<<" "<<s31.c<<endl;
    cout<<"s41: "<<s41.a<<" "<<s41.c<<endl;
    s31.Test();
    s41.Test();
    cout<<"s31: "<<s31.a<<" "<<s31.c<<endl;
    cout<<"s41: "<<s41.a<<" "<<s41.c<<endl;
    s31.a=100;
    s41.c='Z';
    cout<<"直接修改了s31和s41的值!"<<endl;
    cout<<"s31: "<<s31.a<<" "<<s31.c<<endl;
    cout<<"s41: "<<s41.a<<" "<<s41.c<<endl;
    //====================================================================
    // C++的結構體能夠有成員函數
    // C++的結構體沒有構造函數時能夠經過 {...} 方式初始化
    //====================================================================
    
    
    //====================================================================
    //STest5 s51={5,'A'};  
    // error: `s51' must be initialized by constructor, not by `{...}'
    
    //s51.Test2();
    //error: `void STest5::Test2()' is private
    
    //s51.c='Z';
    // error: `char STest5::c' is private
    
    STest5 s52;
    s52.a=52;
    cout<<"s52.a="<<s52.a<<endl;
    s52.Test();
    cout<<"s52.a="<<s52.a<<endl;
    s52.a=10;
    cout<<"s52.a="<<s52.a<<endl;
    //====================================================================
    // 結構體STest5的測試說明:
    // C++中能夠爲結構體的成員設定訪問控制級別 private public protected
    // C++中一旦爲結構體設定訪問控制級別,那麼這個結構體其實就是類
    // 因此不能夠經過 {...} 方式初始化
    // 類中的訪問控制級別和結構體是一致的,可是缺省時:
    // 類中是 private 而結構體中是 public
    // 這是惟一的區別
    //====================================================================
    
    return 0; //在C語言和早期C++中此句不能夠省略,在標準C++中此句可省略 
}

//====================================================================
//運行結果
//====================================================================
// STest結構體構造函數被執行
// STest2結構體構造函數被執行
// s11: 10 S
// s21: 15 T
// 直接修改了s11和s21的值!
// s11: 100 S
// s21: 15 Z
// 經過 {...} 方式初始化 了s31和s41的值
// s31: 1 A
// s41: 2 B
// STest3結構體Test函數被執行
// STest4結構體Test函數被執行
// s31: 10 S
// s41: 15 T
// 直接修改了s31和s41的值!
// s31: 100 S
// s41: 15 Z
// s52.a=52
// STest5結構體Test函數被執行
// s52.a=16
// s52.a=10
//====================================================================
// 總結: C++的結構體能夠分兩部分來看
// 1.保持和C語言兼容的結構體,不涉及函數
// 2.C++支持的結構體,這種結構類事實上和類class功能相同,但有一點區別
// 區別在於
// 類中默認的訪問控制級別爲     private
// 結構體中默認的訪問控制級別爲 public
// 是的,咱們能夠在編程時用 private public protected來修飾結構體中的成員
// C++的結構體就是C語言的結構體和C++中的類的綜合體
//====================================================================

//====================================================================
// 以上測試的錯誤信息是在MinGW編譯器上編譯時複製的
// 以上代碼在
                // Visual Studio 2010 SP1(中文旗艦版)
                // MinGW 20111108
                // Visual C++ 6.0 SP6(中文企業版)
// 這三個編譯器上編譯經過
//====================================================================
相關文章
相關標籤/搜索