【03】类、内联成员函数、结构体、this指针、内存、作用域

版权声明:zhuhurry 未经博主允许不得转载    https://blog.csdn.net/zhuhurry

封装
封装是把客观事物封装成抽象的类,是面向对象程序设计最基本的特性,把数据和函数合成一个整体。并且可以可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。有2层含义( 把属性和方法进行封装 对属性和方法进行访问控制
一、类声明
class 类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护成员
};
public:任何外部函数都可以访问公有类型数据和函数。
private,只允许本类中的函数访问,而类外部的任何函数都不能访问。
protected,只允许本类及其派生类才能访问

二、内联成员函数、成员函数的重载、成员函数的缺省参数
1. 内联成员函数
inline函数默认为内部链接。也就是说 inline函数只能在本文件中使用 ,对其他文件是不可见的。如果我们将inline函数放在.cpp中,则该内联函数只对该.cpp文件有效(即使在.h中声明该内联函数,cpp中实现该内联函数,该内联函数也只对该.ccp文件有效,其他文件无效),这样我们在其他文件中就无法访问这个内联函数,所有我们要将inline函数放在.h文件中,其他文件#include这个.h文件就可以使用它。
如图:内联函数定义在.h中

如图:如果在.h中声明该内联函数,.cpp中实现该内联函数,则在其他文件中就不能调用这个内联函数了。

2. 成员函数的重载
与普通函数的重载规则一样,具体见笔记01
3. 成员函数的参数缺省
与普通函数的参数缺省规则一样,具体见笔记01

三、类和结构体
C++对C中的结构体进行了扩充,不再是一个只能包含不同数据类型的数据结构了,它可以有成员变量、函数、 能继承别的类或结构体、也可以被其他类或结构体继承。
(1) class和struct的语法基本相同 ,从声明到使用,都很相似,但是struct的约束要比class多,理论上,struct能做到的class都能做到,但class能做到的stuct却不一定做的到
(2)struct是值类型,class是引用类型,因此它们具有所有值类型和引用类型之间的差异。
(3)由于栈的执行效率要比堆的执行效率高,但是栈资源却很有限,不适合处理逻辑复杂的大对象,因此struct常用来处理作为基类型对待的小对象,而class来处理某个商业逻辑。
(4) struct不但能继承也能被继承 ,而且可以实现接口, 不过Class可以完全扩展。内部结构有区别,struct只能添加带参的构造函数,不能使用abstract和protected等修饰符,不能初始化实例字段。

四、隐含的this指针
this只能在成员函数中使用。全局函数,静态函数都不能使用this。实际上,成员函数默认第一个参数为T* const register this。
this指针的作用:
找到该对象的成员变量
区分不同的对象
(1)为什么this指针不能再静态函数中使用?
静态函数如同静态变量一样,他不属于具体的哪一个对象,静态函数表示了整个类范围意义上的信息,而this指针却实实在在的对应一个对象,所以this指针当然不能被静态函数使用了,同理,全局函数也一样。总之, this指针不能被全局函数和静态函数使用
(2)this指针什么时候创建?
this指针在成员函数执行前创建,在成员函数执行完成后结束
(3)this指针如何传递给类中函数的?
this是通过函数参数的首参数来传递的 ,成员函数默认第一个参数为T* const register this。
(4) this指针只有在成员函数中才有定义

五、C++内存存储方式
1. 成员函数在内存中的存储方式
我们在定义某个类的多个对象时,系统会为每一个对象分配存储空间,其中每一个对象都会为其数据分配一个存储空间,但是成员函数代码只有一个公共的存储空间,如图所有:
显然,这样做会大大节约存储空间。C++编译系统正是这样做的,因此每个对象所占用的存储空间只是该对象的数据部分(虚函数指针和虚基类指针也属于数据部分)所占用的存储空间,而不包括函数代码所占用的存储空间。

2. C++的内存格局
C++程序的内存格局通常分为四个区: 全局数据区 (data area), 代码区 (code area), 栈区 (stack area), 堆区 (heap area)(即自由存储区)。全局数据区存放全局变量,静态数据和常量; 所有类成员函数和非成员函数代码存放在代码区 ;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区;余下的空间都被称为堆区。根据这个解释,我们可以得知 在类的定义时,类成员函数是被放在代码区 ,而类的静态成员变量在类定义时就已经在全局数据区分配了内存,因而它是属于类的。对于非静态成员变量,我们是在类的实例化过程中(构造对象)才在栈区或者堆区为其分配内存,是为每个对象生成一个拷贝,所以它是属于对象的。
如下图所示:a->print1();居然可以正确输出

原因:
类对象在new出来的只是成员变量,成员函数在类定义时就存在了 所以如果成员函数未使用任何成员变量的话,不管是不是static的,都能正常工作 。而第二句没使用成员变量m,此时m并没有被被创建,使用m则出错。上面的程序等价于:
上图中的thisp指针,就类似我们在调对象的成员函数时,默认传递的首参数this指针,有了这个this指针就可以识别并调用成员变量,有了这个this指针我们可以区分不同的对象。

六、类的作用域
每个类都定义了自己的作用域称为类作用域, 类作用域中说明的标识符(成员变量。成员函数)只在类中可见 。固我们一般会定义一个类的对象,通过这个类的对象去访问类中的成员变量和函数。除了类作用域,还有 块作用域 文件作用域 函数原型作用域 函数作用域 ,举个例子:







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值