返回对象的向量的const引用

时间:2009-10-15 12:49:20

标签: c++ reference const return

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

  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)
    

    但我不确定这是否足够。

3 个答案:

答案 0 :(得分:13)

第3行有效,因为t2是由getS()

返回的引用复制构造的

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

const vector<int>& getS()const;

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

答案 1 :(得分:5)

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

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

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

你不能用一般类型来防范这种情况。 在您自己的类中,您可以将复制构造函数显式标记,并且赋值将失败。

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

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

答案 2 :(得分:2)

第(3)行

对于int类型,复制是微不足道的。如果你把对象放在那里并且他们有一个Copy CTor,这也可以。

第(4)行

成功

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

所以函数也声明为const。
并称之为

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