首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*s.pd与s->pd的差异

*s.pd与s->pd的差异
EN

Software Engineering用户
提问于 2014-12-24 19:43:05
回答 1查看 275关注 0票数 1

我在阅读有关结构的复制构造函数的文章时,发现了以下示例:

代码语言:javascript
复制
#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,但为什么不是正确的方式是

代码语言:javascript
复制
s->pd=9;

为什么在例子中是这样写的呢?

EN

回答 1

Software Engineering用户

发布于 2014-12-24 19:57:29

这是一个操作符优先级没有给出您期望的结果的例子。该示例具有以下代码

代码语言:javascript
复制
*s.pd = 9;

相当于以下内容:

代码语言:javascript
复制
*(s.pd) = 9;

你会问为什么它不是写成

代码语言:javascript
复制
s->pd = 9;

但这相当于

代码语言:javascript
复制
(*s).pd = 9;

也就是说,示例中的代码取消了s成员之一pd的值,而您所询问的代码是关于dereferences的(这是不合法的,因为成都不是指针,"->“操作符也没有过载)。

这是因为".“成员选择运算符比"*”取消引用运算符绑定得更强。

有关完整列表,请参见http://en.cppreference.com/w/cpp/language/operator_优先;“。具有2的优先级,而"*“的优先级为3。仅:”绑定比“强。”。

票数 5
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/267326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档