C++类和对象(上)

1.类的定义

1.类的定义格式

1)class是定义类的关键字,后接类的名字,{}为类的主体。类中的内容成为类的成员,也就是说类中的变量称为类的属性或成员变量,类的函数称为类的方法或成员函数。

eg:

这就是一个简单类的实现,sky就是类的名字。

注意:类在定义结束时后面的分号不能省略。

2)为了区分成员变量和函数的参数,成员变量一般会加一个标识符。如:成员变量前面或者和后面加_或者m开头,注意这个在C++中并不是强制的,只是一些惯例,看个人习惯加什么这都是可以的。

eg: 

在这个例子中我在成员变量前加的是_;如果不加的话,会和成员函数参数重名,就会报错,如果不加的话想要避免报错那就需要换一个名称,这样程序的可读性就会下降。

3)C++中struct也可以定义类,C++兼容C中struct的用法,同时struct也支持使用类,也就是说相较于以前,strcut中也可以定义函数了,不过我们一般推荐使用class

eg:

我们可以看到struct也可以定义一个类。

4)定义在类里面的成员函数默认为inline.也就是说声明和定义分离的话就不是内联函数了。

内联函数在上篇文章有讲到过,

eg:

我们可以看到代码中的Init函数声明和定义分离了,这个时候我们想定义类的成员函数记得需要加作用域操作符::;在这个例子中也就是:Messag:: ,如果不加的话,我们会找不到成员变量,因为{}即为一个域,它中的成员变量就不属于全局变量了。3)的Init函数就符合内联函数的规则,而这个就不属于。

2.访问限定符

1)C++一种实现封装的方式,用类和对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。

2)public修饰的成员变量在类外可以直接被访问,而protectedprivate修饰的成员在类外不能直接被访问。

3)访问权限作用域从该访问限定符出现的位置开始直接到下一个访问限定符出现为止,如果后面没有访问限定符,那么它的域就不会结束,也就是说作用域会到}才结束即类结束。

3)class定义成员变量没有被访问限定符修饰时默认为private,   struct默认为public

4)一般成员变量都会被限制为private/protected,需要给别人使用的成员函数会写为public

当然,访问限定符在一个类中可以出现多次。

3.类域

1)类定义了一个新的作用域,类的所有成员都在这个类域中,在类外定义成员时,就需要使用::作用域操作符指明成员属于哪个类域。这个相信大家很熟悉了,因为刚刚已经举例说过了。

注意:类域只是影响名字的隔离,而不影响它的生命周期。

2)类域影响的是编译的查找规则。

还是刚刚的例子:

当成员函数Init的声明和定义分离时,如果不进行指定的话,他编译函数的时候会将它默认为全局函数,也就是说,函数里面的成员变量需要在全局中出现,否则会报错。

注意:类域没有using展开的说法,也就是说访问其中的成员时需要通过域操作符来进行访问。

2.实例化

1.实例化概念 

1)用类类型在物理内存中创建对象的过程,称为类实例化出对象。

2)类是对象进行一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,没有分配空间,当类实例化出对象时,就会分配空间了。大家可以理解为你手上有一个标签,而此时它还没贴到对应的物品上,而实例化出对象就说明这个标签贴到一个具体的物品上了。

3)一个类可以实例化出多个对象,实例化出的对象,我们刚刚说过了,此时会占用内存空间。

eg:

圈起来的地方这些成员变量就只是声明,而不是定义,等我们实例化出对象在这个例子中就是sky,此时这些成员变量就有了定义,也就是说开辟空间了。

小知识:
声明和定义的区别就在于开没开空间。

2.对象大小

类实例化出的每个对象都要有独立的数据空间,这样才可以存储不同的数据,结合上面的代码例子,如果成员变量没有独立的存储空间,我们如何表示每个人姓名,成绩,学号呢,所以对象中肯定有成员变量,那成员函数的大小计算在内吗,不计算在内。我们要知道函数被编译后是一段指令,对象中没办法存储,这些指令存储在一个单独的区域,那么我们需要存储这个函数的指针到对象中吗,不需要,因为虽然每个对象不一样,但调用对象的函数时指针却是一样的,如果存储的话,那不就很浪费空间吗,还是根据上面的代码举例子,假如我们现在用Message实例化出10000个对象,那函数的指针就要存储10000次,但它们的地址都是一样的,这样就太浪费了。函数指针其实是一个地址,调用函数被编译成汇编指令[call地址],其实在编译器链接时就需要找到函数的地址,而不是在运行时找,只有动态多态才在运行时找,这个时候就需要存储函数指针,也就是函数地址。

上面我们说了对象只存储成员变量,C++规定类实例化的对象也要符合内存对齐规则。

内存对齐规则

1)第一个成员在与结构体偏移量为0的地址处。

2)其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

3)结构体总大小为:最大对齐数(所有变量类型最大者与默认对其参数取最小)的整数倍。

4)如果嵌套了结构体的情况下,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

注意:1.对齐数=编译器默认的一个最大对齐数与于该成员大小的较小值。

          2.VS默认对齐数为8

下面举一个例子具体说明:

这个Message的大小就是8个字节。如何计算的呢:

首先ch是一个字节,所以它占一个字节,而int是4个字节所以此时对齐数是4,根据第二条规则:其它成员变量要对齐到某个数字(对齐数)的整数倍的地址处,所以需要补三个字节即如图所示的第二步,然后在加上a的所占空间即8个字节也符合第三条规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值