后端开发核心技术 第2章面向对象的C++ ②对象的存储空间(虚函数、虚继承)

1、空类的存储空间计算

大小为1,本来应该为0,但是声明该类型的对象的时候,必须在内存中占一定的空间,否则无法使用这些对象,至于占多少内存,由编译器决定

#include<iostream>
using namespace std;
class CBox{
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;//输出1
    return 0;
}

2、只有成员变量的类的存储空间计算

#include<iostream>
using namespace std;
class CBox{
    int length,width,height;
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;//输出12
    return 0;
}

3、有成员变量和静态成员变量

静态数据成员不占对象的内存

静态数据成员不占对象的内存
#include<iostream>
using namespace std;
class CBox{
    int length,width,height;
    static int count;
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;//输出12
    return 0;
}

4、只有一个成员函数

成员函数不占空间

#include<iostream>
using namespace std;
class CBox{
    int foo();
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;//输出1
    return 0;
}

5、有构造函数和析构函数

构造函数和析构函数不占空间

#include<iostream>
using namespace std;
class CBox{
public:
    CBox(){};
    ~CBox(){};
};
int main(){
    CBox boxobj;
    cout<<sizeof(boxobj)<<endl;
    return 0;
}

6、类中有虚的析构函数

为了支持虚函数,会产生额外的复旦,这正是指向虚函数表的指针的大小,64位上占8buye,32位占4

#include<iostream>
using namespace std;
class CBox {
public:
	CBox() {};
	virtual ~CBox() {};
};
int main() {
	CBox boxobj;
	cout << sizeof(boxobj) << endl;//输出4,一个指针的大小
	return 0;
}

7、继承孔磊和多重继承

①继承不改变不改变大小
②虚继承如果与基类虚函数一样,则大小在基类大小情况+4,如果出现新的虚函数+8

#include <iostream>
using namespace std;

class Base
{
public:
	virtual void f();
	virtual void g();
	virtual void h();
};

class Derived1 : public Base
{
public:
	virtual void f1();
	virtual void g1();
	virtual void h1();
};

class Derived2 :public Base
{
public:
	virtual void f();
	virtual void g1();
	virtual void h1();
};

class Derived3 :virtual public Base
{
public:
	virtual void f1();
	virtual void g1();
	virtual void h1();
};

class Derived4 :virtual public Base
{
public:
	virtual void f();
	virtual void g1();
	virtual void h1();
};

class Derived5 :virtual public Base
{
public:
	virtual void f();
	virtual void g();
	virtual void h();
};

class Derived6 :virtual public Base
{

};

int main()
{
	cout << sizeof(Base) << endl; //4
	cout << sizeof(Derived1) << endl; //4
	cout << sizeof(Derived2) << endl; //4
	cout << sizeof(Derived3) << endl; //12
	cout << sizeof(Derived4) << endl; //12
	cout << sizeof(Derived5) << endl; //8
	cout << sizeof(Derived6) << endl; //8

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值