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

关于*解引用与.成员访问运算符优先级的困惑及表达式疑问

C++深拷贝构造器相关问题解答

代码示例

class Deep
{
private:
    int *data;

public:
    int getDataValue() { return *data; }

    // Constructor
    Deep(int d)
    {
        data = new int;
        *data = d;
    }

    // Deep Copy constructor
    Deep(const Deep &source)
        : Deep{*source.data}
    {
        cout << "Copy constructor is called - Deep" << endl;
    }

    // Destructor
    ~Deep()
    {
        delete data;
        cout << "Destructor freeing data" << endl;
    }
};

问题1:为什么*source.data会返回int类型的值?

在C++中,成员访问运算符.的优先级高于解引用运算符*。表达式*source.data的执行顺序是:

  1. 先通过source.data获取Deep对象source的私有成员data,这是一个int*类型的指针;
  2. 再对这个指针执行解引用操作*,得到指针指向的int类型数值。
    因此最终返回的是int类型的值。

问题2:它是否应该写成*(source.data)?我尝试两种写法后结果一致。

两种写法效果完全相同。因为.的优先级本来就高于*,source.data会被优先执行,加括号只是显式强调了这个执行顺序,但编译器的处理逻辑和不加括号时没有区别。如果觉得加括号能让代码逻辑更清晰、避免误解,可以选择*(source.data);直接写*source.data也是完全合法且正确的。

问题3:尽管()优先级更高,为何*(source).data与*source.data结果相同?

这里的括号(source)没有改变任何运算逻辑——它只是把对象source单独括起来,但没有其他运算符参与竞争运算顺序,所以(source).data和source.data完全等价,都是直接获取source的data成员指针。之后对这个指针解引用*,自然和*source.data的结果一致。换句话说,这里的括号没有实际改变运算顺序,两种写法的最终执行逻辑完全相同。


内容的提问来源于stack exchange,提问作者night_ZAK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:22:50