c++this指针
大约 6 分钟
- 区分同名变量: 如果成员函数中存在与成员变量同名的局部变量或参数,那么在没有
this
指针的情况下,无法直接访问成员变量。this
指针允许明确指定使用对象的成员。
// 使用this指针
class MyClassWithThis {
private:
int value;
public:
void setValue(int value) {
// 使用this指针区分成员变量和局部变量
this->value = value;
}
};
- 函数内访问成员: 没有
this
指针,成员函数无法直接访问对象的成员变量和成员函数, 除非它们与局部变量或参数同名。
// 使用this指针
class MyClassWithThis {
private:
int value;
public:
void setValue(int value) {
// 使用this指针访问成员变量
this->value = value;
}
int getValue() {
// 使用this指针访问成员函数
return this->value;
};
- 在函数内传递当前对象: 在某些情况下,需要将当前对象作为参数传递给其他函数。
this
指针允许在成员函数内部方便地传递当前对象的引用。
// 使用this指针
class MyClassWithThis {
private:
int value;
public:
void setValue(int value) {
// 使用this指针访问成员变量
this->value = value;
}
int getValue() {
// 使用this指针访问成员函数
return this->value;
};
总的来说,this
指针提供了一种在成员函数内部引用当前对象的方式,使得在面向对象的编程中更加灵活和清晰。 它有助于避免命名冲突,让代码更加可读、易于理解,并提供了对当前对象的直接访问。
#include <iostream>
static void test()
{
std::cout<<"test"<<std::endl;
}
int main() {
test();
return 0;
}
main.cpp
#include "test.h"
int main() {
test();
return 0;
}
test.h
#pragma once
#include <iostream>
static void test()
{
std::cout<<"test"<<std::endl;
}
main.cpp
#include "test.h"
int main() {
test();
return 0;
}
test.h
#pragma once
#include <iostream>
static void test();
test.cpp
#include "test.h"
void test()
{
std::cout<<"test"<<std::endl;
}
main.cpp
#include "test.h"
int main() {
myclass::test();
return 0;
}
test.h
#pragma once
#include <iostream>
class myclass
{
public:
static void test();
};
test.cpp
#include "test.h"
void myclass::test()
{
std::cout<<"test" << std::endl;
}
main.cpp
#include "test.h"
int main() {
myclass a;
a.test();
return 0;
}
test.h
#pragma once
#include <iostream>
class myclass
{
public:
static void test();
};
test.cpp
#include "test.h"
void myclass::test()
{
std::cout<<"test" << std::endl;
}
main.cpp
#include "test.h"
int main() {
myclass a;
a.test();
return 0;
}
test.h
#pragma once
#include <iostream>
class myclass
{
private:
int value;
public:
static void test(int value);
};
test.cpp
#include "test.h"
void myclass::test(int value)
{
this->value = value;//错误'this' 只能在非 static 成员函数或非 static 数据成员初始值设定项内使用
}
mutable 成员变量: 将需要在常成员函数中修改的成员变量声明为
mutable
。mutable
关键字告诉编译器,即使在常成员函数中,这些成员变量仍然可以被修改。class MyClass { private: mutable int value; // mutable 成员变量 public: MyClass() : value(0) {} void setValue(int newValue) const { // 在常成员函数中修改 mutable 成员变量是允许的 value = newValue; } int getValue() const { // 在常成员函数中访问 mutable 成员变量 return value; } };
通过 const_cast 去除 const 限定: 尽管不推荐,但你可以使用
const_cast
来去除this
指针的常量属性, 以便在常成员函数中修改成员变量。这种做法需要谨慎使用,因为它绕过了const
的本意,可能导致未定义的行为。class MyClass { private: int value; public: MyClass() : value(0) {} void setValue(int newValue) const { // 使用 const_cast 去除 const 限定 const_cast<MyClass*>(this)->value = newValue; } int getValue() const { // 在常成员函数中访问成员变量 return value; } };