类和对象

面向对象程序设计:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。
对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

C++不是纯面向对象语言,而是基于面向对象的语言(因为它包含C的部分,C是面向过程)

类和对象:类是抽象的,对象是具体的,所以类不占用内存,而对象占用内存; 

访问限定符:public/private/protected

1. public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
2. 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
3. 类体中如果没有定义限定符,则默认为私有的。
4. 类的访问限定符体现了面向对象的封装性

类的作用域:(生命周期、访问限制)
1. 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员
函数。
2. 对象可以通过. 直接访问公有成员,指向对象的指针通过->也可以直接访问对象的公有成员。
3. 在类体外定义成员,需要使用:: 作用域解析符指明成员属于哪个类域。

类实例化对象:
1.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。
3.做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑
存在,同样的类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

结构体内存对其规则:所以每个对象的大小为类中所有成员变量的大小之和,当然这里也遵循内存对齐原则。

类成员函数不占空间?

成员函数在公共代码区

1.为什么要内存对齐?

提高访问效率:CPU访问

结构体的内存对齐复习: 默认对齐数windows下默认8, linux默认4,

1>先结构体内部成员的对齐   min(默认对齐数,当前成员类型<大小>中小的)

2>结构体整体对齐    min(默认对齐数和结构体成员最大类型中较小的)

#pragma pack(4)  将系统的默认对齐数设置为4。且只能设置为(1,2,4,8, 16)

#pragma pack()  恢复系统默认对齐数

模拟实现offsetof宏:

#define OFFSETOF(StructName, member)\

(size_t)&(((StructName*)0)->member)

(StructName *)0 这是一个强制类型转换,把0地址强制类型转换成一个指针,这个指针指向一个StructName类型的结构体变量。 (实际上这个结构体变量可能不存在,但是只要我不去解引用这个指针就不会出错)。

((StructName  *)0)->member    (StructName *)0是一个TYPE类型结构体变量的指针,通过指针指针来访问这个结构体变量的member元素

&((StructName *)0)->member  等效于&(((StructName *)0)->member),意义就是得到member元素的地址。但是因为整个结构体变量的首地址是0,所以得到的member元素的地址就是member元素的偏移量。

2.空类对象(无成员变量的类)的大小是多少?为什么?

Size------1;

标识一个空类在程序中存在过,需给类分配空间

class Person
{
	int a;
	char b;
};
class Person2
{
	Person a;
	int c;
	char d;
};

class Person3			//size = 1   空类
{

};

class Person4			//szie = 1     不是严格意义上的空类 但是大小和空类相等
{
	void f(){}
};


int main()
{
	Person p;
	Person p2;
	cout << "person---"<<sizeof(Person) << endl;
	cout << "person2---" << sizeof(Person2) << endl;
	cout << "person3---" << sizeof(Person3) << endl;
	cout << "person4---" << sizeof(Person4) << endl;
	system("pause");
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值