我有两个与同一问题有关的问题:
如何返回属于类的向量的引用?
我有这门课:
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)行有效?
我不希望它可以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().
第3行有效,因为c ++调用向量上的复制构造函数.
您的函数返回一个引用,该引用被传递给向量复制构造函数,并构造您的变量t2.
这是允许的,因为vector的复制构造函数未定义为显式.
你不能用一般类型来防范这种情况.在您自己的类中,您可以将复制构造函数标记为显式,并且赋值将失败.
您可以返回一个const指针.这可以防止副本 - 但可能是危险的,因为用户可能希望能够将指针传递到其有效范围之外.
const vector<int>* getS() {return &s;} //(4)
Run Code Online (Sandbox Code Playgroud)
对于 int 类型,复制很简单。如果你把对象放在那里并且它们有一个复制CTor,这也将起作用。
做了
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)