我有两个与同一问题相关的问题:
如何返回对属于某个类的向量的引用?
我有这堂课:
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
是s
的副本(即当t2
更改时,my_sys.s未更改)。为什么第(3)行有效?
我不希望在类之外更改my_sys.s
,但我想因效率而返回引用。我在哪里放const
?
我尝试将第(1)行更改为
const vector<int>& getS() {return s;} //(4)
但我不确定这是否足够。
答案 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)
对于int类型,复制是微不足道的。如果你把对象放在那里并且他们有一个Copy CTor,这也可以。
成功
const vector<int>& getS() const {return s;}
所以函数也声明为const。
并称之为
const vector<int> & t1 = my_sys->getS();