返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
c++ methods that return instance variables can access data in the variable but not change it, but no error is generated on compile
我已经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()
无效?
我可以解决这个问题,但我想知道:
- 这种行为在编译器之间是否一致
- GCC中是否有错误或警告标志会警告此问题
- 行为背后的根本原因和/或原因是什么
这是我的代码:
#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; }
相关文章:
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- C++ 在编译时具有函数计算全局变量
- Makefile g++ 使用命令行中的 -D 变量进行编译,默认值
- 可视化编译与 C++ 中的 Extern 变量
- 跨模板化函数编译的静态变量
- 在编译时为运行时设置环境变量
- 全局变量在 C++ 中是否显着提高了编译速度?
- 模板类编译问题与 typedef 变量
- constexpr 函数在编译时获取值,即使我的变量不是 constexpr
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- C++ 编译时在两个变量之间交替
- Constexpr变量不是编译时值
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- C++11 - 获取编译时的所有类变量,并在没有 Boost 的情况下为它们调用方法
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 分配给静态变量的局部变量;编译错误在'c'但在 C++ 中成功
- Apache Ignite v2.7:无法构建 Linux ODBC 驱动程序 - 内联变量编译错误
- 在源代码中使用环境变量(编译时间)
- 可能是的GCC错误,使用两个变量编译
- C/C++ 外部 "C" 变量编译宏