C++类和对象--初阶

发布于:2025-05-12 ⋅ 阅读:(20) ⋅ 点赞:(0)

C++类和对象—初阶

01. 面向对象与面向过程深度对比

面向过程:以过程为中心,关心问题解决的步骤。执行效率高,适合简单问题,内存占用小。但是代码复杂性高,维护成本高。
线性流程:点餐 → 烹饪 → 上菜 → 结账

主函数
函数a
子函数b
子函数c

面向对象:将一个事物拆成多个对象,以对象为中心,关心对象间的交互。代码复用和扩展方便适用于团队开发。
交互对象:顾客、服务员、厨师、收银员,通过消息传递协作

对象A
对象B
对象C
对象D

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. 类的对象大小的计算

  1. 第一个成员在与结构体偏移量为0的地址处。
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
    VS中默认的对齐数为8
  3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
    体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

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

在这里插入图片描述

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指针的特性

  1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值

  2. 只能在“成员函数”的内部使用

  3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针

  4. this指针是“成员函数”第一个隐含的指针形参(存在栈上边),一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

  5. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针

  6. this指针是“成员函数”第一个隐含的指针形参(存在栈上边),一般情况由编译器通过ecx寄存器自动传递,不需要用户传递


网站公告

今日签到

点亮在社区的每一天
去签到