探索C++对象模型之struct和class区别

从语法上来讲,class和struct做类型定义时只有两点区别:
 
(1)默认继承权限,如果不指定,来自class的继承按照private继承处理,来自struct的继承按照public继承处理;
 
(2)成员的默认访问权限。class的成员默认是private权限,struct默认是public权限。以上两点也是struct和class最基本的差别,也是最本质的差别;
 
但是在C++中,struct进行了扩展,现在它已经不仅仅是一个包含不同数据类型的数据结构
 
了,它包括了更多的功能;
 
首先,struct能包含成员函数吗?是的,答案是肯定的。
 
好的,写一段代码验证一下:
 
[cpp] 
#include "stdafx.h"  
   
struct Test  
{  
    int a;  
    int getA()  
    {  
        return a;  
    }  
   
    void setA(int temp)  
    {  
        a = temp;  
    }  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
    Test testStruct;  
    testStruct.setA(10);  
    cout<<"Get the value from struct:"<<testStruct.getA()<<endl;  
   
    Test *testStructPointer = new Test;  
    testStructPointer->setA(20);  
    cout<<"Get the value from struct again:"<<testStructPointer->getA()<<endl;  
    delete testStructPointer;  
   
    return 0;  
}  
 
以上的代码会很正确的运行,是的;没错,struct能包含成员函数的。
 
第二,struct有自己的构造函数吗?是的,可以的。
 
#include "stdafx.h"  
struct Test  
{  
    int a;  
   
    Test()  
    {  
        a = 100;  
    }  
   
    int getA()  
    {  
        return a;  
    }  
   
    void setA(int temp)  
    {  
        a = temp;  
    }  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
    Test testStruct;  
    testStruct.setA(10);  
    cout<<"Get the value from struct:"<<testStruct.getA()<<endl;  Test *testStructPointer = new Test;     testStructPointer->setA(20);  
    cout<<"Get the value from struct again:"<getA()<<endl;  
    delete testStructPointer;  
   
    // test the constructor  
    Test testConstructor;  
    cout<<"Set the value by the construct and get it:"<<testConstructor.getA()<<endl;  
   
    return 0;  
}  
 
第三,struct可以有析构函数么?让我来验证一下;
[cpp]  
#include "stdafx.h"  
struct Test  
{  
    int a;  
   
    Test()  
    {  
        a = 100;  
    }  
   
    int getA()  
    {  
        return a;  
    }  
   
    void setA(int temp)  
    {  
        a = temp;  
    }  
   
    ~Test()  
    {  
        cout<<"Destructor function called."<<endl;  
    }  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
    Test testStruct;  
    testStruct.setA(10);  
    cout<<"Get the value from struct:"<<testStruct.getA()<<endl;  Test *testStructPointer = new Test;     testStructPointer->setA(20);  
    cout<<"Get the value from struct again:"<getA()<<endl;  
    delete testStructPointer;  
   
    // test the constructor  
    Test testConstructor;  
    cout<<"Set the value by the construct and get it:"<<testConstructor.getA()<<endl;  
   
    return 0;  
}  
 
是的,完全支持析构函数。
第四,struct支持继承么?再让我写代码验证一下;
[cpp] 
#include "stdafx.h"  
   
struct A  
{  
    int a;  
    A()  
    {  
        a = 10;  
    }  
    void print()  
    {  
        cout<<"I am from A"<<endl;  
    }  
};  
   
struct B : A  
{  
    int b;  
    B()  
    {  
        a = 30; // set a to 30  
        b = 20;  
    }  
    /*void print() 
    { 
    cout<<"I am from B"<<endl; 
    }*/  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
    B b1;  
    cout<<b1.a<<endl;  
    cout<<b1.b<<endl;  
    b1.print();  
   
    A a1;  
    cout<<a1.a<<endl;  
    a1.print();  
   
    return 0;  
}  
 
运行上述代码,struct支持继承。
第五,struct支持多肽么?写代码测试一下便知;
[cpp] 
#include "stdafx.h"  
   
struct A  
{  
    virtual void print() = 0;  
};  
   
struct B : A  
{  
    void print()  
    {  
        cout<<"I am from B"<<endl;  
    }  
};  
   
struct C : A  
{  
    void print()  
    {  
        cout<<"I am from C"<<endl;  } }; int _tmain(int argc, _TCHAR* argv[]) {     A *a1;  B *b1 = new B;  C *c1 = new C;  a1 = b1;    a1->print(); // call B, not A  
   
    a1 = c1;  
    a1->print(); // call C, not A  
   
    return 0;  
}  
 
第六,struct支持private、protected和public关键字么?
[cpp]  
#include "stdafx.h"  
struct A  
{  
private:  
    int b;  
   
protected:  
    int c;  
   
public:  
    A()  
    {  
        b = 10;  
        c = 20;  
        d = 30;  
    }  
   
    int d;  
};  
   
struct B : A  
{  
    void printA_C()  
    {  
        cout<<A::c<<endl;  
    };  
   
    // private member can not see  
    /*void printA_B() 
    { 
        cout<<A::b<<endl; 
    }*/  
   
    void printA_D()  
    {  
        cout<<A::d<<endl;  
    }  
};  
   
int _tmain(int argc, _TCHAR* argv[])  
{  
   
    A a1;  
    B b1;  
   
    // private member can not see  
    //cout<<a1.b<<endl;  
   
    // protected member can not see  
    //cout<<a1.c<<endl;  
   
    // public member can see  
    cout<<a1.d<<endl;  
   
    return 0;  
}  
 
写了这么多了,那么会出现这种一个状况,如果是class的父类是struct关键字描述的,那么默认访问属性是什么?
当出现这种情况时,到底默认是public继承还是private继承,取决于子类而不是基类。class可以继承自struct修饰的类;同时,struct也可以继承自class修饰的类,继承属性如下列描述:
[cpp] 
struct A{};  
class B:A{}; // private 继承  
   
class A{};  
struct B:A{}; // public 继承  
 
最后,那么到底是使用struct,还是使用class呢?这个看个人喜好,但是这里有一个 编程规范的问题,当你觉得你要做的更像是一种数据结构的话,那么用struct,如果你要做的更像是一种对象的话,那么用class。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值