打印变量的类型请参考《C++ 之 打印变量的类型》
#include <QCoreApplication>
#include <iostream>
#include <typeinfo>
#include <string>
#include <cxxabi.h>
std::string getClearName(const char* name)
{
int status = -1;
char* clear_name = abi::__cxa_demangle(name, NULL, NULL, &status);
const char* demangle_name = (status==0) ? clear_name : name;
std::string ret_val(demangle_name);
free(clear_name);
return ret_val;
}
class Test {
int m_a;
public:
void func_1() {
std::cout << getClearName(typeid(this).name()) << std::endl;
std::cout << getClearName(typeid(Test*).name()) << std::endl;
std::cout << getClearName(typeid(Test* const).name()) << std::endl;
this->m_a = 100; // 编译通过
}
void func_2() const {
std::cout << getClearName(typeid(this).name()) << std::endl;
std::cout << getClearName(typeid(const Test*).name()) << std::endl;
std::cout << getClearName(typeid(const Test* const).name()) << std::endl;
//this->m_a = 100; // 编译报错
}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Test test;
test.func_1();
test.func_2();
return a.exec();
}
输出结果为:
Test*
Test*
Test*
Test const*
Test const*
Test const*
结论1:从测试结果来看func_1中this指针的类型可能为Test* ,也可能为Test* const,正解为Test* const。
结论2:void func_2() const; 此处的const作用于this指针指向的对象,表明this指针指向的对象的成员变量不可修改。
- func_2中this指针的类型为Test const* const;
- func_1中的this->m_a = 100; 编译通过,而func_2中的this->m_a = 100; 编译报错;
- 以上两点可佐证结论2。