代码之家  ›  专栏  ›  技术社区  ›  ng5000

C++对SydDypTR与参考的引用

  •  0
  • ng5000  · 技术社区  · 15 年前

    所有的,

    我最近贴了这个 question 关于DAL设计。由此看来,将对象引用传递到函数中,然后填充该对象的函数将是C++数据访问层的良好接口,例如。

      bool DAL::loadCar(int id, Car& car) {} 
    

    我现在想知道使用boost::shared\u ptr的引用是否更好,例如

      bool DAL::loadCar(int id, boost::shared_ptr<Car> &car)
    

    有什么想法吗?一个比另一个有优势吗?

    将const正确性应用于两个调用的含义是什么?

    事先谢谢。

    4 回复  |  直到 15 年前
        1
  •  3
  •   sbk    15 年前

    AS SBI 说,“这取决于函数的作用。”

    但是,我认为上面最重要的一点不是是否允许空值,而是函数是否存储一个指向对象的指针以供以后使用。如果函数只填充了一些数据,那么出于以下原因,我将使用引用:

    • 不使用共享指针、用于堆栈对象等的客户端仍然可以使用该函数。
    • 使用带有共享指针的函数仍然很简单-共享指针具有返回引用的取消引用运算符
    • 不能传递空值
    • 少打字
    • 我不喜欢在不需要的时候使用“东西”

    如果函数需要存储指针以备日后使用,或者您预计函数可能会发生变化,从而需要存储指针,那么请使用共享指针。

        2
  •  3
  •   sbi    15 年前

    这取决于函数的作用。

    通常,接受指针的函数表示调用方可能调用此函数,即使它们没有要传递给它的对象-它们总是可以传递 NULL .如果这符合函数的规范,那么使用(智能)指针。通过引用来传递引用计数智能指针而不是复制它们是一种优化(我应该补充一点,这不是过早的优化),因为它避免了不必要的增加和减少引用计数,在mt环境中,这可能会对性能造成显著影响。

    将非常量引用作为参数的函数应传递可能更改的有效对象。调用方不能(合法地)调用该函数,除非他们有一个有效的对象,并且除非他们愿意让该函数更改对象的状态,否则不会调用该函数。如果这更符合函数的规范,请使用引用。

        3
  •  1
  •   sbi    15 年前

    如果必须接收有效的对象(即不希望调用方传递空值),那么无论如何,不要使用boost::shared_ptr。第二个示例传递对“智能指针”的引用….忽略细节,它是一个“指向汽车指针的指针”。因为它是引用,所以共享的指针对象不能为空….但这并不意味着它不能有空值(即指向“空”对象)。

    我不明白为什么你会认为对智能指针的引用会“更好”—调用函数已经使用智能指针了吗?

    至于“const”的含义……你的意思是像

    bool DAL::loadCar(int id, const Car& car) {}
    

    ? 如果是的话,这将适得其反,你要向编译器传达这样一个事实:“汽车”不会改变(但你可能希望它改变!).

    或者你的意思是让函数“const”,类似于

    class DAL{
       bool loadCar(int id, Car& car) const;
    }
    

    ?

    在后一种情况下,您通知编译器/API用户“loadcar”方法不会修改DAL对象。如果这是真的,那么这样做是一个好主意——不仅它支持一些编译器优化,而且通常在“契约”(函数签名)中指定函数不修改DAL是一件好事,特别是如果在代码中进行这种隐式假设(这样可以确保这一点保持不变,并且未来没有人会以改变“dal”对象的方式修改“loadcar”功能)

        4
  •  0
  •   Daniel Daranas    15 年前

    在第一种情况下,您只需通过一辆车,并“填充它”的信息。例如,您可以创建一辆“默认”汽车,然后将其加满。我看到其中一个不便之处:拥有两类汽车并不太难:一类是糟糕的、默认的、无用的、“空”的汽车,另一类是真正的从功能中获得的汽车。对我来说,一辆车就是一辆车,所以它应该是一辆有效的车(例如,我可以从A点开到B点;我可以加速、制动、启动、停止)在你的功能前后。

    我通常使用传统的指针,而不是Boost(顺便说一句,没有问题),所以我真的不能对后一种选择发表评论。