【问题标题】:Pass pointers to objects by constant reference in C++在 C++ 中通过常量引用传递指向对象的指针
【发布时间】:2013-04-17 22:25:21
【问题描述】:

我正在为大学做一项实际作业,但遇到了一个问题。 我有一个声明这个方法的类:

bool graficarTablero(const Tablero *&tablero, const string &nombreArchivo);

我想通过常量引用传递一个指向对象 Tablero 的指针。 如果我调用该函数,例如:

ArchivoGrafico *grafico = new ArchivoGrafico;
if(grafico->graficarTablero(tablero, ARCHIVO_GRAFICO)){ ...

...我得到编译错误。好的,我不会详细说明我得到的错误,因为我认为我已经找到了解决方案,方法是将方法头替换为:

bool graficarTablero(Tablero* const& tablero, const string &nombreArchivo);

现在似乎可以工作(至少现在可以编译),但我想知道的是为什么第一个声明不起作用而第二个声明不起作用。好吧,更重要的是,我真的很想知道它们是否真的意味着相同的东西(通过常量引用指向对象的指针)。

好的,谢谢你的回答。


编辑 1: 我想做的是避免按值传递。 好吧,我知道这并不是一个真正昂贵的操作,但真的没有办法使用同一个指针并承诺不会以任何方式修改它吗?

谢谢。


编辑 2: 对不起,我没有仔细阅读杰里科芬的回答。 是的,这就是我要找的。并不是我真的必须这样做,但有一天我可能会发现这个小小的优化很有用。

【问题讨论】:

    标签: c++ pointers parameters reference constants


    【解决方案1】:

    从右到左阅读声明,& 使用“引用”,* 使用“指针”。

    1. const Tablero *&tablero => tablero 是对指向 const Tablero 的指针的引用
    2. Tablero* const& tablero => tablero 是对指向 Tablero 的 const 指针的引用

    我很难找出后者有用的情况——如果你要传递一个 const 引用,你也可以只传递一个指针本身的副本。 const 引用通常主要用作按值传递的替代方法,但要避免复制值,因此它主要在您的值较大时很有用(例如,较大的 std::vector 或按该顺序排列的东西)。在指针的情况下,您最好按值传递它(因为复制指针通常非常便宜)。通常,如果您通过引用传递指针,则可以修改指针 - 但在这种情况下,const 会阻止这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-04
      • 2020-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多