隐藏的 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 指针访问成员变量
}
};
静态成员
- 什么是静态成员?
- 静态成员是属于类本身的成员,而不是属于某个对象的成员。
- 静态成员变量和静态成员函数都属于静态成员。
- 静态成员变量
- 声明方式:在成员变量声明前加上
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;
}
常量成员
- 什么是常量成员?
- 常量成员是指在声明时使用
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;
}