【问题标题】:Does using the * operator on a pointer create a copy?在指针上使用 * 运算符会创建副本吗?
【发布时间】:2020-10-08 03:50:10
【问题描述】:

我对此感到好奇已经有一段时间了。假设我们有以下情况来访问存储在动态分配的内存中的类的数据成员:

class C {
public :
    C() = default; 
    int a = 4; 
}

int main () {
    C * ptr = new C(); 
    std::cout << "pointer->::" << ptr->a << std::endl; 
    std::cout << "dereference*().::" << (*ptr).a << std::endl; 
}

我确定指针方法是首选方法,我的猜测是取消引用指针提供了一个引用,至少在 C++ 中是这样。但是在没有引用的C语言中(并假设适当的修改将类转换为结构等),像这样取消引用和访问成员会导致临时浅拷贝吗?这是编译器优化出来的东西吗?

【问题讨论】:

  • 不涉及复制。 取消引用 C 中的指针works the same:“结果是一个左值表达式,它指定了指向的对象。”。 ptr-&gt;a(*ptr).a 这两种形式是完全等价的。

标签: c++


【解决方案1】:

在 C 和 C++ 中,*p(解除引用)和p-&gt;m(通过指针访问成员)都是"lvalue expressions"。左值“评估对象身份”。 *pp-&gt;m 不会(自己)创建副本,它引用一个已经存在的变量。

【讨论】:

  • 啊啊啊,说得有道理。非常感谢您的回答,这为我解决了问题。
【解决方案2】:

取消引用指针不会为CC++ 创建副本。 解引用操作的结果是一个描述指向对象的左值。 但无论如何,C 和 C++ 的行为是相同的。

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2013-02-19
    • 2013-07-22
    • 2020-08-12
    • 1970-01-01
    • 2015-02-08
    相关资源
    最近更新 更多