精品C++浓缩精华知识点---类和this指针

类和对象

编译器在开空间时,是一把将类空间大小开好,所以类内前后顺序无所谓

C语言关注过程,将不同的步骤分开,所以C语言是函数体的集合,函数之间的调用和交互

C++关注对象及其对象之间的关系,是类的集合,不同的类之间交互

C++是基于面向对象,因为兼容C语言,所以既面向对象,又面向过程

在C++中,结构体类型可以只写名字了。在C语言中,还是struct 名字

类是对对象进行描述的,是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它

一个类可以实例化出多个对象(变量),实例化出的对象 占用实际的物理空间,存储类成员变量

只保存成员变量,成员函数存放在公共的代码段

C++引入了类,结构体的升级版,在C++的class中既可以定义变量,又可以定义函数。C++的类就是比C语言的struct多了一个成员函数,用法基本相同,多了访问限定符,数据和方法就封装在了类里面,可以进行各种控制

进行类的声明和定义:类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::

类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。之后声明类中的成员变量时,一定要写成这样:int year_ int month_

访问限定符public private protected:修饰限定的是从这一个限定符到下一个限定符或者结尾

public修饰的成员在类外可以直接被访问。

protected和private在类外不能被访问

class默认访问权限是private,struct默认权限是public(因为struct要兼容C)

在类里面不受访问限定符的限制,在类里面的对象可以自由访问私有

在C++中,用{ }括起来的中间部分都可以称之为域。全局域,局部域,命名空间域,类域 。 在域的外面想使用某个域中的对象的声明(没有开空间),都需要使用域作用限定符

如下图,类成员函数的声明和定义分离。在类域外面使用类中的名字时,需要加类作用限定符,这样就可以在类外面访问到内中的元素

注意:在类外面调用类中的成员函数和成员变量时(定义,已经开空间),必须有一个实例化的对象。静态成员除外

类的大小(sizeof)就是类中成员变量的大小,类中的成员函数不占大小,成员变量占空间,当类中没有成员变量,成员函数空类都是给一个字节的空间表示占位。成员函数存在代码段

为什么要内存对齐:

当CPU访问数据时,由于硬件原因,只能从整数倍(比如32比特的整数倍)的位置开始访问,内存对齐,可以方便访问数据,访问数据时只需要一次访问,如果不内存对齐,像右边一样,访问int a,需要从第一个整数倍开始访问,一次访问不够,还需要在第二个整数倍的地方进行第二次访问,还需要进行拼接才能拼出int a    这是一个牺牲空间换时间的规定,可以加快CPU访问数据的时间

this指针

this指针:this是const的不能修改的,是类对象的地址,可以通过this指针访问对象中的成员变量和成员函数,this→

C++中的成员函数的参数中有一个隐藏的参数→this指针,只要是成员函数,参数中的第一个永远是this指针。C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(程序运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

this在实参和形参的位置不能写,但是可以在类里面可以显示的用

成员函数不存在对象里面(对象或指针为空就可以直接访问,但是如果成员函数中涉及到this指针访问成员变量,就必须有对象才能调用该函数),成员函数的地址在公共的代码区域

上面两个代码都是运行正常(原理一样,这里没有解引用,所以不受空指针的影响),因为成员函数的地址不存在对象里面,当调用成员函数的时候,形成汇编指令,汇编指令call函数地址,这个成员函数的地址是在公共代码区,不在对象里面,所以这个代码里面的p→是对象指针访问对象里面的成员,但是函数不需要p→访问,所以可以正常运行,如果是访问成员变量,比如p→_a,就必须通过对象的指针才能访问到,但是在这里就会运行报错,因为p是一个空指针。运行过程中分为两步,一是传递this指针,将p传给this指针,p的地址传给ecx,,传到寄存器,相当于是在传参数,ecx存this指针的地址二是找地址,在公共的代码区,编译器拿着这个名字找函数地址,变成call地址,调用函数一共分两步,一是传参,二是call地址

this指针的自身内容是不可修改的,准确的写,是Date* const this。 也就是说,this指针指向哪块空间是不可以改变的,this指针指向的那块空间的值是可以改变的

c++封装,c++将数据和方法封装在一起,严格管控,想让别人访问的放在公共区域。不想让别人访问的设置私有。这一点比c语言好,不能太自由。

  • 31
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值