structのCとC++の違い

6742 ワード

/*- ==========================================================
*          :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(     )
//            
//====================================================================