如何判断C++变量类型及类不同成员函数内this指针的具体类型
C++变量类型判断与this指针类型推导解答
一、判断变量是指针还是普通变量的方法
完全可以在编译期判断变量是指针类型还是普通变量类型,不需要运行时操作:
- C++11及更高版本可以直接使用标准库的类型萃取工具
std::is_pointer,示例代码如下:
#include <type_traits> #include <iostream> int main() { int normal_var = 1; int* ptr_var = &normal_var; // 输出true说明是指针类型,输出false说明是普通变量 std::cout << std::boolalpha << "p是指针吗?" << std::is_pointer_v<decltype(ptr_var)> << std::endl; return 0; }
- 更低版本的C++也可以自行实现简单的类型萃取模板来实现判断,逻辑和标准库实现一致。
二、Test类三个成员函数的this类型分析
首先纠正一个错误前提:静态成员函数test2内部不存在this指针,也完全不允许访问this,你所说的“this可在test2内部访问”的描述是错误的,尝试在test2里访问this会直接编译报错。
剩下两个非静态成员函数的this类型如下:
test1是普通非const非静态成员函数,this类型为Test* const:该类型代表this指针本身的指向不可修改,但可以通过this修改指向的Test实例的非const成员。- 你给出的
test3定义中,const关键字修饰的是返回值,不是成员函数本身,因此它也是普通非const非静态成员函数,this类型和test1一致为Test* const。如果你是笔误把const写在了返回值前,实际要定义const成员函数(即写法为int test3(int i) const),那么此时this类型为const Test* const:既不能修改this的指向,也不能通过this修改指向的Test实例的任何成员。
三、自行推导this类型的方法
你可以通过两个方法快速确定this的类型:
- 记住C++标准定义的this指针通用规则:
- 非const非静态成员函数:
类名* const - 参数列表后加const修饰的非静态成员函数:
const 类名* const - 参数列表后加volatile修饰的非静态成员函数对应加上volatile关键字即可
- 静态成员函数无this指针
- 非const非静态成员函数:
- 编译期触发报错验证:故意在成员函数内写
this = nullptr;这类错误代码,编译器报错时会直接打印this的完整类型,不需要额外查文档。
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

