C++ 对象和类 — 专题笔记(第 10 章)

← C++ 知识地图|←返回OOP


目录


🔴类的基本概念

🔺类 = 数据(成员变量)+ 操作(成员函数),是对结构体的扩展

🔺类定义描述数据格式及用法,对象是根据类创建的具体实体(类之于对象 = 类型之于变量)

class Stock {
private:
    char company[30];
    int shares;
    double share_val;
    double total_val;
public:
    void acquire(const char* co, int n, double pr);
    void buy(int num, double price);
    void sell(int num, double price);
    void show();
};

🔺类声明放在头文件(.h),成员函数定义放在实现文件(.cpp


🔴访问控制:public / private

🔺private(默认):只有类的成员函数可以访问,外部代码不能直接访问

🔺public:任何代码都可以访问

🔺数据隐藏(封装):将数据成员设为 private,通过 public 接口操作数据,防止外部直接修改

🔺struct 默认 publicclass 默认 private


🔴成员函数的实现

🔺在类外定义成员函数时,用作用域解析运算符 :: 指明所属类:

void Stock::show() {
    cout << "Company: " << company << endl;
    cout << "Shares: " << shares << endl;
}

🔺同一个类的不同对象调用同一个成员函数,函数通过 this 指针区分是哪个对象

🔺内联成员函数:定义在类声明内部的函数自动成为内联函数;也可在类外用 inline 显式声明


🔴构造函数

🔺构造函数在创建对象时自动调用,用于初始化成员变量

🔺没有返回类型(连 void 也没有),函数名与类名相同

// 声明
Stock(const char* co, int n, double pr);
 
// 定义
Stock::Stock(const char* co, int n, double pr) {
    strncpy(company, co, 29);
    company[29] = '\0';
    shares = n;
    share_val = pr;
    total_val = n * pr;
}

🔺调用方式

Stock food("World Cabbage", 250, 1.25);   // 显式调用
Stock food = Stock("World Cabbage", 250, 1.25); // 等价
Stock* pf = new Stock("Peanuts", 300, 2.0);     // 堆上创建

🔺默认构造函数:无参数的构造函数;若未定义任何构造函数,编译器自动生成;一旦定义了有参构造,编译器不再自动生成默认构造

Stock();                    // 声明默认构造
Stock::Stock() {            // 定义
    company[0] = '\0';
    shares = 0;
    share_val = 0.0;
    total_val = 0.0;
}

🔺也可用默认参数合并为一个构造函数:

Stock(const char* co = "Error", int n = 0, double pr = 0.0);

🔴析构函数

🔺对象销毁时⭐自动调用,用于释放构造函数中申请的资源,

🔺名称为 ~类名无参数、无返回类型

Stock::~Stock() {
    // 若构造函数中用 new 分配了内存,在此 delete
}

🔺若类中没有用 new,析构函数可以为空体,但必须提供(编译器会自动生成空析构)

🔺调用时机

  • 栈对象:离开作用域时
  • 堆对象:执行 delete
  • 静态对象:程序结束时

🔴this 指针

🔺每个成员函数都有一个隐含的 this 指针,指向调用该函数的对象

🔺用于在成员函数内返回对象本身(支持链式调用):

const Stock& Stock::topval(const Stock& s) const {
    if (s.total_val > total_val)
        return s;
    else
        return *this;  // 解引用 this 得到对象本身
}

🔴const 成员函数

🔺在函数声明和定义的参数列表后加 const,保证该函数不修改调用对象

void show() const;          // 声明
void Stock::show() const {  // 定义
    cout << shares << endl;
}

🔺const 对象只能调用 const 成员函数,否则编译报错


🔴类的作用域

🔺类中定义的名称(成员变量、成员函数)的作用域为整个类,类外必须用 :: 访问

🔺在类中定义枚举常量(避免用 #define):

class Bakery {
    enum { Months = 12 };   // 作用域限定在类内,不占存储空间
    double costs[Months];
};

🔺C++11 起可用 static constconstexpr 在类内定义整型常量:

这里的static存在的意义是告诉这个变量是这个类的通用变量,不需要每个都复制一遍

class Bakery {
    static const int Months = 12;
    double costs[Months];
};