C++ 第十课:深入类和对象
一、回顾与引入 1
- 回顾上节课内容:类和对象的基本概念、构造函数、析构函数
二、隐藏的 this
指针 4
- 什么是
this
指针?- 每个非静态成员函数都有一个指向调用该函数的对象的指针,这个指针被称为
this
指针。 this
指针是一个隐含的参数,它被编译器自动传递给成员函数。
- 每个非静态成员函数都有一个指向调用该函数的对象的指针,这个指针被称为
this
指针的类型this
指针的类型是指向当前对象的指针,例如,对于类MyClass
,this
指针的类型为MyClass* const
。
- 何时使用
this
指针- 当需要在成员函数中引用当前对象时,可以使用
this
指针。 - 当需要区分成员变量和局部变量同名的情况时,可以使用
this
指针。
- 当需要在成员函数中引用当前对象时,可以使用
- 显式使用
this
指针- 通常情况下,可以省略
this
指针,编译器会自动识别。 - 在一些情况下,为了代码清晰或者避免歧义,可以显式地使用
this
指针。
- 通常情况下,可以省略
- 示例代码
c++
class MyClass {
public:
int value;
void setValue(int value) {
this->value = value; // 使用 this 指针区分成员变量和参数
}
void printValue() {
cout << "value: " << this->value << endl; // 使用 this 指针访问成员变量
}
};
三、静态成员 6
- 什么是静态成员?
- 静态成员是属于类本身的成员,而不是属于某个对象的成员。
- 静态成员变量和静态成员函数都属于静态成员。
- 静态成员变量
- 声明方式:在成员变量声明前加上
static
关键字。 - 内存分配:静态成员变量在程序开始时分配内存,在程序结束时释放内存。
- 初始化:必须在类定义外部进行初始化。
- 访问方式:可以通过类名和作用域解析符
::
访问,也可以通过对象访问。
- 声明方式:在成员变量声明前加上
- 静态成员函数
- 声明方式:在成员函数声明前加上
static
关键字。 - 特点:
- 没有
this
指针,因此无法访问非静态成员变量或调用非静态成员函数。 - 可以访问静态成员变量和调用静态成员函数。
- 没有
- 访问方式:可以通过类名和作用域解析符
::
访问。
- 声明方式:在成员函数声明前加上
- 示例代码
c++
class MyClass {
public:
static int count; // 声明静态成员变量
static void printCount() { // 声明静态成员函数
cout << "Count: " << count << endl;
}
};
int MyClass::count = 0; // 在类定义外部初始化静态成员变量
int main() {
MyClass::count = 10; // 通过类名访问静态成员变量
MyClass::printCount(); // 通过类名访问静态成员函数
MyClass obj;
obj.count = 20; // 通过对象访问静态成员变量
obj.printCount(); // 通过对象访问静态成员函数
return 0;
}
四、常量成员 6
- 什么是常量成员?
- 常量成员是指在声明时使用
const
关键字修饰的成员变量或成员函数。 - 常量成员的值在初始化后不能被修改。
- 常量成员是指在声明时使用
- 常量成员变量
- 声明方式:在成员变量声明前加上
const
关键字。 - 初始化:只能在构造函数初始化列表中进行初始化。
- 声明方式:在成员变量声明前加上
- 常量成员函数
- 声明方式:在成员函数声明后加上
const
关键字。 - 特点:
- 不能修改任何成员变量的值。
- 不能调用非
const
成员函数。 this
指针是指向常量的指针,即const MyClass* const
。
- 声明方式:在成员函数声明后加上
- 示例代码
c++
class MyClass {
public:
const int value; // 声明常量成员变量
// 构造函数初始化列表中初始化常量成员变量
MyClass(int val) : value(val) {}
int getValue() const { // 声明常量成员函数 const MyClass* const
return value;
}
};
int main() {
MyClass obj(10);
// obj.value = 20; // 错误:不能修改常量成员变量的值
cout << "Value: " << obj.getValue() << endl;
return 0;
}
五、构造函数参数初始化列表 4
- 什么是构造函数参数初始化表?
- 构造函数参数初始化表是在构造函数的参数列表和函数体之间,使用冒号
:
分隔的代码块。 - 用于初始化成员变量。
- 构造函数参数初始化表是在构造函数的参数列表和函数体之间,使用冒号
- 使用场景
- 初始化常量成员变量。
- 初始化引用类型的成员变量。
- 初始化没有默认构造函数的类类型的成员变量。
- 语法
c++
class MyClass {
public:
int value1;
int value2;
MyClass(int val1, int val2) : value1(val1), value2(val2) {}
};
- 示例代码
c++
ååclass MyClass {
public:
const int value1;
int& value2;
MyClass(int val1, int& val2) : value1(val1), value2(val2) {
//
}
};
int main() {
int x = 10;
MyClass obj(5, x);
return 0;
}
作业
设计一个 Date
类
- 成员变量:
- 年份 (整型,常量)
- 月份 (整型)
- 日期 (整型)
- 成员函数:
- 构造函数: 使用参数初始化表初始化所有成员变量。
printDate()
: 以 "YYYY-MM-DD" 的格式打印日期。isLeapYear()
: 判断当前日期是否为闰年,返回布尔值。(提示: 可以使用this
指针访问年份)