【问题标题】:Returning a const reference to vector of an object返回对对象向量的 const 引用
【发布时间】:2009-10-15 12:49:19
【问题描述】:

我有 2 个与同一问题相关的问题:

  1. 如何返回对属于某个类的向量的引用?

    我有这门课:

    class sys{
        protected:
            vector<int> s;
    
        public:
            sys();
            vector<int>& getS() {return s;} //(1)
    };
    

    (1) 应该返回向量s 的引用。但是,在main()

    main(){
        sys* my_sys = new sys();
        vector<int> &t1  = my_sys->getS(); //(2)
        vector<int> t2 = my_sys->getS(); //(3)
        ...
    }
    
    • t1 是对 s 的引用(即,当 t1 更改时,my_sys.s 也会更改)。
    • t2s 的副本(即当 t2 更改时,my_sys.s 未更改)。

    为什么第 (3) 行有效?

  2. 我不希望在课堂之外更改my_sys.s,但出于效率考虑,我想返回一个引用。我应该把const放在哪里?

    我试图将第 (1) 行更改为

    const vector<int>& getS() {return s;} //(4)
    

    但我不确定这是否足够。

【问题讨论】:

    标签: c++ reference constants return


    【解决方案1】:

    第 3 行有效,因为 t2 是从 getS() 返回的引用复制构造的

    您对 getS() 返回的引用进行 const 限定的方式是可以的。您也可以对 getS() 进行 const 限定,即:

    const vector<int>& getS()const;
    

    以便可以在 const sys 上调用 getS()。

    【讨论】:

      【解决方案2】:

      第 3 行有效,因为 c++ 调用了向量上的复制构造函数。

      您的函数返回一个引用,该引用被传递给向量复制构造函数并构造您的变量 t2。

      这是允许的,因为 vector 的复制构造函数未定义为显式。

      您无法使用通用类型来防范这种情况。 在您自己的类中,您可以将复制构造函数标记为显式,并且分配将失败。

      您可以改为返回一个 const 指针。 这将防止复制 - 但可能很危险,因为用户可能希望能够将指针传递到其有效范围之外。

      const vector<int>* getS() {return &s;} //(4)
      

      【讨论】:

      • 我不认为 const 指针有帮助,只是让它不太方便。向量 cv = *getS();将制作矢量的副本。
      • 我认为取消对 rhs 的引用比 lhs 上缺少 & 的可能性更小——但你永远不能牢固地锁定 c++ 行为:)
      【解决方案3】:

      第 (3) 行

      对于 int 类型,复制起来很简单。如果你把对象放在那里并且它们有一个 Copy CTor,这也可以工作。

      第 (4) 行

      做起来

      const vector<int>& getS() const {return s;}
      

      所以函数也被声明为 const。
      并这样称呼它

      const vector<int> & t1 = my_sys->getS(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-07
        • 2023-01-04
        • 2013-04-21
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 2023-04-11
        相关资源
        最近更新 更多