在类的非静态成员函数中,this指针指向当前对象,其值即为该对象的首地址;打印时不可直接用cout输出this指针。

用 this 指针直接获取当前对象地址
在类的非静态成员函数里,this 就是指向当前对象的指针,它的值就是该对象的首地址。打印时别直接用 cout ,否则可能被当成 <code>bool 输出 1(尤其在旧编译器或某些优化下)。
- 必须强制转成
void*或uintptr_t再输出,确保显示真实地址值 -
printf更稳妥:printf("%p", (void*)this) -
std::cout需配合static_cast<void>(this)</void>,否则依赖流重载行为,不可靠
打印地址时常见的格式错误和崩溃风险
直接写 cout 看似能编译,但实际调用的是 <code>operator 对 <code>bool 的重载——因为 this 是指针,而指针到 bool 有隐式转换,结果永远是 1(非空指针),完全不是地址。
- 用
%p格式符必须传void*,传错类型(如int*)会导致未定义行为 - 在
std::cout中漏掉static_cast<void></void>,某些标准库实现会静默失败或输出 0 - 不要用
std::hex ,<code>size_t在 32/64 位平台宽度不同,且不保证与指针可互转
完整可运行示例(含构造/析构验证)
#include <iostream>
#include <cstdio>
<p>struct Foo {
Foo() { printf("construct at %p\n", (void<em>)this); }
~Foo() { printf("destruct at %p\n", (void</em>)this); }
void print_addr() { std::cout << "addr: " << static_cast<void*>(this) << "\n"; }
};</p><p>int main() {
Foo a;
a.print_addr(); // 输出和构造时一致
}</p>注意:printf 的 %p 输出格式依赖平台(如 Linux 带 0x 前缀,Windows 可能不带),但值准确;std::cout 输出的 void* 格式由标准库决定,通常也带前缀,两者值相同。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
静态成员函数里不能用 this
静态函数没有隐式 this 参数,强行访问会编译报错:error: invalid use of 'this' outside of a non-static member function。如果真需要某个对象地址,得显式传入指针或引用,比如 static void log_addr(const Foo* obj) { printf("%p", (void*)obj); }。
立即学习“C++免费学习笔记(深入)”;
对象地址本身不跨线程共享安全问题,但打印时机很重要——比如在析构函数里访问 this 是合法的(析构刚开始时对象内存尚未释放),但之后立即用就变成野指针。


















