c++;返回实例变量的方法可以访问变量中的数据,但不能更改它,但编译时不会生成错误 我已经15年没有做过任何C++编程了,所以我有点生疏了。 我注意到,返回实例变量的C++方法可以访问变量中的数据,但不改变它,但是在编译时没有用G++生成错误。我在下面附上了一个简单的例子来说明这种行为。返回实例变量的函数的返回可用于访问ivar中的信息,但当返回用于更改ivar时(例如,anA.aVec().push_back(100);),ivar不会更改
澄清;为什么c++;返回实例变量的方法可以访问变量中的数据,但不能更改它,但编译时不会生成错误 我已经15年没有做过任何C++编程了,所以我有点生疏了。 我注意到,返回实例变量的C++方法可以访问变量中的数据,但不改变它,但是在编译时没有用G++生成错误。我在下面附上了一个简单的例子来说明这种行为。返回实例变量的函数的返回可用于访问ivar中的信息,但当返回用于更改ivar时(例如,anA.aVec().push_back(100);),ivar不会更改,c++,function,return-value,instance-variables,C++,Function,Return Value,Instance Variables,澄清;为什么anA.aVec().size()有效,而anA.aVec().push_back(100)无效?类似地,为什么anA.aB().i()起作用,而anA.aB().setI()不起作用 我可以解决这个问题,但我想知道: 这种行为在编译器中是一致的吗 GCC中是否有警告此问题的错误或警告标志 行为背后的根本原因和/或理由是什么 这是我的密码: #include <cstdlib> #include <vector> using namespace std;
anA.aVec().size()
有效,而anA.aVec().push_back(100)
无效?类似地,为什么anA.aB().i()
起作用,而anA.aB().setI()
不起作用
我可以解决这个问题,但我想知道:
#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;
}
anA.aVec()
将其更改为返回引用以避免创建副本:
vector<int> & aVec(void){ return _aVec; }
vector&aVec(void){return\u aVec;}
anA.aVec()。push_back(100)
不“工作”,因为aVec
方法返回向量的副本
将其更改为返回引用以避免创建副本:
vector<int> & aVec(void){ return _aVec; }
vector&aVec(void){return\u aVec;}
为什么anA.aVec().size()
有效,而anA.aVec().push_back(100)
无效?
类似地,为什么anA.aB().i()
起作用,而anA.aB().setI()
不起作用
anA.aVec()
和anA.aB()
按值返回对象。对象的副本将返回给调用函数
anA.aVec().size()
和anA.aB().i()
工作,因为它们只是返回一条信息
anA.aVec().push_back(100)
和anA.aB().setI()
也可以工作,但它们修改的是临时对象,而不是作为anA
成员变量的对象
为什么anA.aVec().size()
有效,而anA.aVec().push_back(100)
无效?
类似地,为什么anA.aB().i()
起作用,而anA.aB().setI()
不起作用
anA.aVec()
和anA.aB()
按值返回对象。对象的副本将返回给调用函数
anA.aVec().size()
和anA.aB().i()
工作,因为它们只是返回一条信息
anA.aVec().push_back(100)
和anA.aB().setI()
也可以工作,但它们修改的是临时对象,而不是作为anA
成员变量的对象问题在于:
vector<int> aVec(void){ return _aVec; }
向量aVec(void){return\u aVec;}
它返回一个_aVec的副本,所以只需在“vector”之后添加“&”,它将作为引用返回
vector<int>& aVec(void){ return _aVec; }
vector&aVec(void){return\u aVec;}
问题在于:
vector<int> aVec(void){ return _aVec; }
向量aVec(void){return\u aVec;}
它返回一个_aVec的副本,所以只需在“vector”之后添加“&”,它将作为引用返回
vector<int>& aVec(void){ return _aVec; }
vector&aVec(void){return\u aVec;}
谢谢大家(1201节目,安东·马利舍夫,R萨胡,迪克里)。我通过切换到指针来修复它,但是引用更干净……应该记住这一点。您不必在Python和Java中思考太多:-),谢谢大家(1201程序,Anton Malyshev,R Sahu,DiCri)。我通过切换到指针来修复它,但是引用更干净……应该记住这一点。您不必在Python和Java中考虑太多:-)。