我在阅读有关结构的复制构造函数的文章时,发现了以下示例:
#include <iostream>
#include <string>
using namespace std;
struct SomeData {
int * pd;
string id;
SomeData(SomeData & ref) {
cout << "Copy Constructor called" << endl;
pd = new int (*ref.pd);
id = "Copy Constructed";
}
SomeData(string name) {
pd = new int(0);
id = name;
cout << "Constructor for " << id << endl;
};
~SomeData() {
cout << "Destructor for " << id << endl;
delete pd;
}
};
int main() {
SomeData s("First");
*s.pd = 9;
SomeData s2=s;
cout << *s2.pd << endl;
return 0;
}在main中,使用取消引用访问SomeData的成员pd,但为什么不是正确的方式是
s->pd=9;为什么在例子中是这样写的呢?
发布于 2014-12-24 19:57:29
这是一个操作符优先级没有给出您期望的结果的例子。该示例具有以下代码
*s.pd = 9;相当于以下内容:
*(s.pd) = 9;你会问为什么它不是写成
s->pd = 9;但这相当于
(*s).pd = 9;也就是说,示例中的代码取消了s成员之一pd的值,而您所询问的代码是关于dereferences的(这是不合法的,因为成都不是指针,"->“操作符也没有过载)。
这是因为".“成员选择运算符比"*”取消引用运算符绑定得更强。
有关完整列表,请参见http://en.cppreference.com/w/cpp/language/operator_优先;“。具有2的优先级,而"*“的优先级为3。仅:”绑定比“强。”。
https://softwareengineering.stackexchange.com/questions/267326
复制相似问题