关于*解引用与.成员访问运算符优先级的困惑及表达式疑问
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的执行顺序是:
- 先通过
source.data获取Deep对象source的私有成员data,这是一个int*类型的指针; - 再对这个指针执行解引用操作
*,得到指针指向的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
相关产品推荐
相关产品推荐

