13

我有 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改变了)。
    • t2是 COPY s(即t2my_sys.s 何时更改时未更改)。

    为什么第 (3) 行有效?

  2. 我不希望my_sys.s在课堂之外进行更改,但出于效率考虑,我想返回参考。我在哪里放const

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

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

    但我不确定这是否足够。

4

3 回答 3

15

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

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

const vector<int>& getS()const;

这样就可以在 const sys 上调用 getS()。

于 2009-10-15T12:56:11.783 回答
5

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

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

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

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

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

const vector<int>* getS() {return &s;} //(4)
于 2009-10-15T12:56:43.550 回答
2

线 (3)

对于 int 类型,复制起来很简单。如果您将对象放在那里并且它们具有 Copy CTor,这也将起作用。

线 (4)

做了

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

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

const vector<int> & t1 = my_sys->getS(); 
于 2009-10-15T12:55:16.253 回答