返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误

c++ methods that return instance variables can access data in the variable but not change it, but no error is generated on compile

本文关键字:变量 编译 错误 但不能 方法 c++ 实例 访问 返回 数据      更新时间:2023-10-16

我已经15年没有做任何C++编程了,所以我有点生疏。

我注意到,返回实例变量的C++方法可以访问变量中的数据,但不能更改它,但在使用G++编译时不会产生错误。我在下面附上了一个简单的例子来说明这种行为。返回实例变量的函数的返回可以用于访问ivar中的信息,但当返回用于更改ivar(例如anA.aVec().push_back(100);(时,ivar不会更改。

澄清;为什么anA.aVec().size()有效,而anA.aVec().push_back(100)无效?同样,为什么anA.aB().i()有效,而anA.aB().setI()无效?

我可以解决这个问题,但我想知道:

  1. 这种行为在编译器之间是否一致
  2. GCC中是否有错误或警告标志会警告此问题
  3. 行为背后的根本原因和/或原因是什么

这是我的代码:

#include <cstdlib>
#include <vector>
using namespace std;
class B{
int _i = 0;
public:
B(void){ }
int i(void){return _i;}
void setI(int anInt){ _i = anInt; }
};
class A{
vector<int> _aVec;
B _aB;
public:
vector<int> aVec(void){ return _aVec; }
B aB(void){ return _aB; }
void pushBack(int anInt){ _aVec.push_back(anInt);}
void setBI(int i){ _aB.setI(i); }
};
int main(int argc, char** argv) {
int rows = 10;
int cols = 8;
srand(time(NULL));
A anA;
cout << "aVec size:" << anA.aVec().size() << "n";
anA.aVec().push_back(100);
cout << "aVec size:" << anA.aVec().size() << "n";
anA.pushBack(100);
cout << "aVec size:" << anA.aVec().size() << "n";
cout << "Bi:" << anA.aB().i() << "n";
anA.aB().setI(1);
cout << "Bi:" << anA.aB().i() << "n";
anA.setBI(1);
cout << "Bi:" << anA.aB().i() << "n";
return 0;
}

输出:

aVec size:0
aVec size:0
aVec size:1
Bi:0
Bi:0
Bi:1

anA.aVec().push_back(100)不"工作",因为aVec方法返回向量的副本。

将其更改为返回引用以避免创建副本:

vector<int> & aVec(void){ return _aVec; }

为什么anA.aVec().size()有效,而anA.aVec().push_back(100)无效
同样,为什么anA.aB().i()有效,而anA.aB().setI()无效?

anA.aVec()anA.aB()按值返回对象。对象的副本将返回给调用函数。

CCD_ 14和CCD_。

anA.aVec().push_back(100)anA.aB().setI()也可以工作,但它们修改一个临时对象,而不是作为anA成员变量的对象。

问题就在这里:

vector<int> aVec(void){ return _aVec; }

它返回_aVec的副本,所以只需在"vector"后面加上"&",它就会作为引用返回。

vector<int>& aVec(void){ return _aVec; }