目录
面向过程和面向对象
C语言
C++
类的定义
类的两种定义方式
成员变量命名规则
类的访问限定符和封装
面试题
封装
类的作用域
类的实例化
类对象模型
内存分配
内存对齐
this指针
特性
面试题
this指针存储在哪里?
this指针可以为空么?
结论:
面向过程和面向对象
C语言
C语言是面向过程,关注的主要是过程,分析求解问题的步骤,通过函数调用逐步解决问题
C++
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成
类的定义
在C语言中结构体只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,在C++中,更喜欢用class来代替
类的两种定义方式
一种是是声明和定义全放在类里面
如果成员函数定义在类中,编译器会将其当作内联函数处理
另一种是类的声明放在.h文件这种,类的定义放在.c文件中(需要注意,成员函数名前需要加类名::)
.h文件
.c文件
成员变量命名规则
为了区分成员函数中的变量是成员变量还是成员函数,我们通常在成员函数前加上 _
类的访问限定符和封装
c++实现封装的方式,用类将对象的属性与方法结合在一起,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用
说明:
public修饰的成员可以在类外面使用
protected和private修饰的成员不能在内外直接使用
访问权限作用域是从一个操作符开始开始到下一个操作符,如果没有到 } 结束
class默认权限为private,struct的默认权限是public
面试题
c++中class和struct的区别是什么?
C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来
定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类
默认访问权限是private
封装
面向对象的三大特性:封装,继承和多态
封装:将数据和操作数据的方法进行有机结合,隐藏数据的属性和实现细节,仅对外公开接口和对象进行交互,c++通过类来实现
封装本质是一种管理,类比于电脑主机来说,厂家出厂时在外部套上壳子,将内部隐藏起来,仅提供开关机和接口等让用户与计算机进行交互
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中,在类外定义成员时需要使用 :: 作用域操作符指定成员属于哪个作用域
类的实例化
用类类型创建对象的过程,称为类的实例化
类是对对象进行描述的,并没有直接分配实际的内存空间
类实例化出来的对象占用实际的物理空间,存储类成员变量
类比于建造房子,类就相当于图纸,实例化出来的对象相当于房子
类对象模型
一个类中既可以存储成员变量,也可以存储成员函数
内存分配
类中的成员函数放在公共代码区,不计入内存的计算
结论:一个类的大小实际是该类中的成员变量之和,注意内存对齐
空类的大小是一个字节
内存对齐
this指针
在d1,d2分别调用init函数时,为了区分不同对象,c++给每个非静态的成员变量都增加了一个隐藏指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作都是通过该指针去访问用户不需要传递,编译器自己完成
特性
1.this指针的类型是 * const,在成员函数中不能给this赋值
2.this指针只能在函数内部使用
3.this指针本质是成员函数的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参,所以对象中不存储this指针
4.this指针是成员函数第一个隐含的形参,一般由编译器通过ecx寄存器自动传递,不需要用户传递
面试题
this指针存储在哪里?
编译器在获取到对象地址后保存在this指针,存放在寄存器ecx中,不同编译器存储位置不同
this指针可以为空么?
this指针可以为空,当我们调用的函数不需要调用对象中的变量时可以为空
1.this为空,没有调用对象中的变量,程序正常运行
2.this为空,调用对象中的变量,程序崩溃