C++类和对象—初阶
01. 面向对象与面向过程深度对比
面向过程:以过程为中心,关心问题解决的步骤。执行效率高,适合简单问题,内存占用小。但是代码复杂性高,维护成本高。
线性流程:点餐 → 烹饪 → 上菜 → 结账
面向对象:将一个事物拆成多个对象,以对象为中心,关心对象间的交互。代码复用和扩展方便适用于团队开发。
交互对象:顾客、服务员、厨师、收银员,通过消息传递协作
02. 类的定义与对象创建
类由 class
关键字修饰,有public,protected,private
三类访问修饰符,类定义必须以分号结束。类主体包含:
成员变量:存储对象状态(private修饰变量建议_
标识,避免与类中函数变量名重名误解)。
成员函数:定义对象行为动作
代码示例:
class ClassName { // class 关键字声明类
// 类成员组成
private: // 私有访问修饰符
int _age; // 成员变量(属性)
char _address;
public:
void showInfo() { // 成员函数
// 函数实现
cout <<_age<<"---"<<_address << endl:
}
...
}; // 分号不可省略
//类的创建
ClassName zhangsan;
**封装:**将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来 和对象进行交互。
03. 类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用( :: )作用域操作符指明成员属于哪个类域。
public:
void ClassName::showInfo() { // 成员函数
// 函数实现
cout <<_age<<"---"<<_address << endl:
}
04. 类的实例化
类比 | 类(Class) | 对象(Object) |
---|---|---|
建筑图纸 | 房屋设计蓝图 | 按图纸建造的实际房屋 |
数据类型 | int(类型定义) | int a = 5(具体变量) |
做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设
计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象
才能实际存储数据,占用物理空间
05. 类的对象大小的计算
- 第一个成员在与结构体偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的对齐数为8 - 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
类中只保存成员变量,成员函数存放在公共的代码段
06. this制作
在 C++ 中,this
指针是一个隐含的、由编译器自动管理的指针,它指向当前对象的地址。
定义一个date类:
class Date{
public:
void Init(int year, int month, int day){
_year = year;
_month = month;
_day = day;
}
void Print(){
cout <<_year<< "-" <<_month << "-"<< _day <<endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
int main(){
Date d1, d2;
d1.Init(2022,1,11);
d2.Init(2022, 1, 12);
d1.Print();
d2.Print();
return 0;
}
Date类
中有两个成员函数,函数体中没有关于不同对象的区分。C++中通过编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针的特性
this
指针的类型:类类型* const
,即成员函数中,不能给this
指针赋值只能在“成员函数”的内部使用
this
指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针this
指针是“成员函数”第一个隐含的指针形参(存在栈上边),一般情况由编译器通过ecx
寄存器自动传递,不需要用户传递this
指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针this
指针是“成员函数”第一个隐含的指针形参(存在栈上边),一般情况由编译器通过ecx
寄存器自动传递,不需要用户传递