返回对象的向量的const引用

11 c++ const return reference

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

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

    我有这门课:

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

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

    main(){
        sys* my_sys = new sys();
        vector<int> &t1  = my_sys->getS(); //(2)
        vector<int> t2 = my_sys->getS(); //(3)
        ...
    }
    
    Run Code Online (Sandbox Code Playgroud)
    • t1是一个参考s(即t1改变时也改变my_sys.s).
    • t2是一个COPY s(即t2更改时my_sys.s未更改).

    为什么第(3)行有效?

  2. 我不希望它可以my_sys.s在课外改变,但我想因效率而返回参考.我在哪里放const

    我试图将第(1)行改为

    const vector<int>& getS() {return s;} //(4)
    
    Run Code Online (Sandbox Code Playgroud)

    但我不确定这是否足够.

Éri*_*ant 13

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

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

const vector<int>& getS()const;
Run Code Online (Sandbox Code Playgroud)

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


mor*_*lli 5

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

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

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

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

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

const vector<int>* getS() {return &s;} //(4)
Run Code Online (Sandbox Code Playgroud)


for*_*idt 3

线路 (3)

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

线路 (4)

做了

const vector<int>& getS() const {return s;}
Run Code Online (Sandbox Code Playgroud)

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

const vector<int> & t1 = my_sys->getS(); 
Run Code Online (Sandbox Code Playgroud)