C++中对象名存储的内容是什么?如何打印相关信息?
C++对象名到底存的是什么?怎么在控制台打印相关信息?
一、先搞懂C++对象名的本质
和Java的对象模型完全不一样:
- 当你写
Cls obj;的时候,obj就是对象本身,它直接存储着对象的所有成员数据(也就是值),既不是地址,也不是类似Java的引用。Java里的对象名是指向堆上对象的“指针式引用”,但C++里这种直接声明的对象,就是实体本身,默认存在栈上(除非用new分配到堆内存)。 - 要是用指针声明,比如
Cls* p = new Cls();,那p才是存储对象在堆上的地址;要是用引用Cls& ref = obj;,ref就是obj的别名,和obj是同一个实体,语法上完全等价。
二、怎么在控制台打印相关信息?
1. 打印对象的内存地址
想获取对象的内存位置,用&取地址运算符直接打印即可:
#include <iostream> class Cls { // 可添加任意成员变量或方法 }; int main() { Cls obj; // 打印栈上对象的地址 std::cout << &obj << std::endl; // 堆上对象的指针本身就是地址,直接打印指针 Cls* pObj = new Cls(); std::cout << pObj << std::endl; delete pObj; // 记得释放堆内存 return 0; }
输出会是类似0x7ffeefbff5d0的十六进制地址,和Java里Cls@372f7a8d中的地址部分是同一个概念。
2. 打印对象的具体内容
C++默认没有定义自定义类和std::ostream的<<运算符,所以直接cout << obj会报错。要打印对象内容,需要手动重载<<运算符:
#include <iostream> #include <string> class Cls { private: int num = 10; std::string str = "hello"; public: // 声明友元函数,方便访问私有成员 friend std::ostream& operator<<(std::ostream& os, const Cls& obj); }; // 实现重载的<<运算符 std::ostream& operator<<(std::ostream& os, const Cls& obj) { // 自定义输出格式 os << "Cls 对象:num=" << obj.num << ", str=" << obj.str; return os; } int main() { Cls obj; std::cout << obj << std::endl; return 0; }
运行后会输出Cls 对象:num=10, str=hello这类具体的成员数据。
3. 打印对象的类型名称(可选)
如果想查看对象的类型,使用typeid运算符(需要包含<typeinfo>头文件):
#include <iostream> #include <typeinfo> class Cls{}; int main() { Cls obj; std::cout << typeid(obj).name() << std::endl; return 0; }
不同编译器的输出格式有差异,比如GCC下可能显示3Cls,MSVC下会显示class Cls。
内容的提问来源于stack exchange,提问作者infinull
相关产品推荐
相关产品推荐

