C++ 类和对象

类和对象

目录

类和对象

面向过程和面向对象的区别

类和对象 

定义类的格式

定义类的方式  ​

类的作用域 

面向对象特性

封装

C++程序设计中是如何体现封装性的

 访问限定符

类的实例化

类的大小 

 this指针

this指针的特性 

汇编角度来看this

函数参数调用约定

this指针的存放位置 

 This指针是否可以为空


面向过程和面向对象的区别

C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
例如小明起床上课这件事
以面向过程角度来看:起床,刷牙,上课。
C++基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
以面向对象的角度来看:角色:小明;拥有的物品:床,牙刷和杯子,鞋子;小明可以做什么:起床,刷牙,穿鞋,走去教室

类和对象 

 类:

用来对实体(对象)进行描述的,对象有什么属性,以及对象具有什么功能,是一种自定义类型。

对象:

在现实生活中实实在在存在的,对象是对具体体现,用 类型创建出来的变量------对象

定义类的格式

class Classname{

类体:成员变量----属性,成员函数----功能

} ;

class定义类的关键字ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号

类中的元素称为类的成员类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数

定义类的方式 

 方式一:将类的声明和定义全部放在类中定义

 方式二:在头文件中放类的声明,在源文件中放类的定义

 在实际应用中采用方式二的情况多一些

方式一:

 

 

方式二:类的声明 

 

成员函数的定义

 

类的作用域 

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员,需要使用:: 作用域解析符 指明成员属于哪个类域。

面向对象特性

封装

将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。例如函数就是一种封装,是对函数中一条条语句的封装。

C++程序设计中是如何体现封装性的

将数据和操作数据的方法进行有机结合------>

隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互------->通过控制访问权限来控制哪些成员可以在类外被访问。

 访问限定符

 

 struct定义的类:成员默认的访问权限是public

 class定义的类:成员默认的访问权限是private

类的实例化

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

 

类的大小 

 

每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多 个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。那么如何解决呢

 

 结论

结论:一个类的大小,实际就是该类中成员变量之和,当然也要进行内存对齐,注意空类的大小,空类比 较特殊,编译器给了空类一个字节来区分标识这个类。

 this指针

Question

在成员函数中没有任何对对象的说明,那么成员函数在执行的时候是怎么知道要具体对哪个对象进行操作的呢?

Answer 

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

this指针的特性 

  • this指针的类型:类类型* const
  • 只能在“成员函数”的内部使用
  • this指针本质上其实是一个成员函数的形参是对象调用成员函数时,将对象地址作为实参传递给this形参所以对象中不存储this指针
  • this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

汇编角度来看this

 

 

函数参数调用约定

从右至左依次调用 

 

 

this指针的存放位置 

 

 This指针是否可以为空

可以为空,当this指针为空时,如果在成员函数中没有访问任何成员变量或成员函数,则代码不会崩溃 ,否则就会崩溃

以下没有访问所以没有崩溃 

void Func(){
    cout<<"Func()"<<endl;
}

 END

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值