在C++的面向对象编程体系中,this指针、静态成员和常量成员函数是入门阶段必须掌握的三个核心概念,它们分别对应对象实例标识、类级别共享数据、成员变量保护三种不同的编程需求,理解清楚三者的特性才能写出更规范的C++代码。

一、this指针
this指针是C++类中每个非静态成员函数都隐含的一个指针参数,它指向调用该成员函数的当前对象实例。当我们在成员函数中访问成员变量或其他成员函数时,编译器实际上会通过this指针来定位对应的对象成员。
1. this指针的基本使用场景
最常见的使用场景是当成员函数的参数名和成员变量名相同时,通过this指针来区分二者,避免变量名冲突导致的赋值错误。
#include <iostream>
using namespace std;
class Student {
private:
int age; // 成员变量
public:
// 参数名和成员变量名相同,用this指针区分
void setAge(int age) {
this->age = age; // this->age指向当前对象的成员变量age,右侧age是函数参数
}
int getAge() {
return this->age; // 也可以省略this,直接写return age,编译器默认通过this访问成员变量
}
};
int main() {
Student stu;
stu.setAge(18);
cout << "学生年龄:" << stu.getAge() << endl;
return 0;
}
2. this指针的特性
- this指针是隐含参数,不需要我们手动定义,也不能在成员函数的参数列表中显式声明。
- this指针的类型是 类名* const,即指针本身是常量,不能修改指向的对象,但可以通过它修改所指向对象的非const成员变量。
- 静态成员函数没有this指针,因为静态成员函数属于类,不属于某个具体对象,不需要通过对象调用。
二、静态成员
静态成员分为静态成员变量和静态成员函数,它们都属于类本身,而不是属于某个具体的对象实例。所有对象共享同一份静态成员,静态成员的生命周期和整个程序的生命周期一致。
1. 静态成员变量
静态成员变量需要在类内声明,类外初始化,初始化时不需要加static关键字,且初始化语句一般放在.cpp文件中,避免重复定义。
#include <iostream>
using namespace std;
class Counter {
public:
static int count; // 类内声明静态成员变量,记录创建的对象数量
Counter() {
count++; // 每创建一个对象,count加1
}
};
// 类外初始化静态成员变量,不需要加static
int Counter::count = 0;
int main() {
Counter c1;
Counter c2;
Counter c3;
// 静态成员变量可以通过类名直接访问,也可以通过对象访问
cout << "当前对象数量:" << Counter::count << endl;
cout << "通过对象访问:" << c1.count << endl;
return 0;
}
2. 静态成员函数
静态成员函数没有this指针,因此不能直接访问非静态成员变量和非静态成员函数,只能直接访问静态成员。静态成员函数可以通过类名直接调用,不需要创建对象实例。
#include <iostream>
using namespace std;
class MathUtils {
public:
static int add(int a, int b) { // 静态成员函数,实现两个数的加法
return a + b;
}
};
int main() {
// 不需要创建对象,直接通过类名调用静态成员函数
int result = MathUtils::add(3, 5);
cout << "加法结果:" << result << endl;
return 0;
}
三、常量成员函数
常量成员函数是在函数声明后面加上const关键字的成员函数,它的作用是承诺不会修改当前对象的任何非静态成员变量(除非成员变量被mutable修饰)。
1. 常量成员函数的定义和使用
常量成员函数可以被常量对象调用,也可以被非常量对象调用;但非常量成员函数不能被常量对象调用。
#include <iostream>
#include <string>
using namespace std;
class Book {
private:
string title;
int price;
public:
Book(string t, int p) : title(t), price(p) {}
// 常量成员函数,只读取成员变量,不修改
string getTitle() const {
return title;
}
int getPrice() const {
return price;
}
// 非常量成员函数,修改成员变量
void setPrice(int p) {
price = p;
}
};
int main() {
const Book book1("C++ Primer", 89); // 常量对象
cout << "书名:" << book1.getTitle() << endl;
// book1.setPrice(99); // 错误,常量对象不能调用非常量成员函数
Book book2("Effective C++", 79); // 非常量对象
book2.setPrice(85); // 正确,非常量对象可以调用非常量成员函数
cout << "修改后价格:" << book2.getPrice() << endl;
return 0;
}
2. 常量成员函数的注意事项
- 常量成员函数内部不能修改非
mutable的非静态成员变量,也不能调用其他非常量成员函数。 - 如果成员变量被
mutable修饰,即使在常量成员函数中也可以修改它的值。 - 常量成员函数的
const关键字是函数签名的一部分,在类外定义常量成员函数时也需要加上const。
三者对比总结
| 特性 | this指针 | 静态成员 | 常量成员函数 |
|---|---|---|---|
| 所属主体 | 非静态成员函数隐含参数 | 类本身 | 类成员函数 |
| 是否有this指针 | 有 | 静态成员函数无,静态成员变量不涉及 | 有,但被const修饰,不能修改指向对象的内容 |
| 访问权限 | 可访问所有非静态成员 | 只能直接访问静态成员 | 不能修改非mutable非静态成员变量,可访问所有只读成员 |
| 调用方式 | 由编译器自动传递,无需手动调用 | 可通过类名或对象调用 | 可通过常量/非常量对象调用 |