struct和class比较,以及简单的内存布局

论何时该使用struct何时该使用class?
struct本身可以像class一样,声明public protected private等存取段来控制权限,或者默认的使用完全public的一个接口,以及virtual function,以及单一继承,多重继承,虚拟继承等等等 ,如下两段代码时完全等同的
class Stu
{
public:
//....function
};
struct Stu
{
//....function
};
有的教科书上说struct没有private data,也没有data相应的操作,这说的是纯c的语法,这根c++的“使用者自定义类型”(user-defined type)应该区分开来
在《深度探索c++对象模型》书中说到关键字本身之前并没有这种差异,看如下代码
class Stu;
struct Stu
{
    void Print(){cout<<"hello"<<endl;}
};
此处会出错嘛?答案是不会,“使用者自定义类型”不会因为你的关键词的使用而有任何差异,如果说用struct就用C的数据存储方式,而class用的是C++的ADT(Abstract Data Type),那自然会错误。就像在一个文件中声明static int a;与extern int a;会矛盾。 是同一个道理。


下面我们看一些不同之处,比如在模版中可以这样写template<class T>此时,若是写成template<struct T>是不行的
还有变长数组的情况,如下代码
struct Stu
{
   //other function and member
    char p[1];
};
int main(int argc, const char * argv[]) {
    char str[]="mutable array";
    struct Stu * pstu=(struct Stu*)malloc(sizeof(struct Stu)+strlen(str)+1//分配足够的内存
    strcpy(pstu->p,str);//拷贝
    
    cout<<pstu->p<<endl;
    return 0;
}
若此时改用class,且该class有public private protected等不同存取段,此时就可能行不通了,为什么说可能?因为c++在同一个存取段中的数据在内存中排放是按照声明顺序决定的,而不同存取段段就不一定了
如:
class Stu
{
public:
protected:
private:
char p[1];
};
此时除非private的内存布局是在最后,才能保证上述变长数组的手段有效,然而谁都没有办法保证嘛。同理,在继承关系中data members的内存布局也没有强制规定,所以此时也不能保证上述手段有效。
但是办法总是人想出来的,记得在《effective C++》里讲到,尽量用组合代替继承以解耦,也就是说当非要使用C语言里的声明方式时,可以如下
struct C_Point
{
char p[1];
};
class Point
{
public:
//....
private:
C_Point pt;
};
此时便能满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值