C++ 对象和类 — 专题笔记(第 10 章)
目录
🔴类的基本概念
🔺类 = 数据(成员变量)+ 操作(成员函数),是对结构体的扩展
🔺类定义描述数据格式及用法,对象是根据类创建的具体实体(类之于对象 = 类型之于变量)
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 默认 public,class 默认 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 const 或 constexpr 在类内定义整型常量:
这里的static存在的意义是告诉这个变量是这个类的通用变量,不需要每个都复制一遍
class Bakery {
static const int Months = 12;
double costs[Months];
};