You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 18:28:30