我有一个类的以下结构用于只读变量(原则取自here)
#include <iostream>
#include "test.h"
using namespace std;
int main(int argc, const char * argv[]) {
Test test;
cout << test.x << endl; // Should be 0.
test.f(test.x);
cout << test.x << endl; // Should be 10.
return 0;
}
类Test
#ifndef __CPP_Playground__test__
#define __CPP_Playground__test__
#include <iostream>
class Test {
private:
int x_;
public:
const int &x;
void f(int target);
Test() : x(x_) {}
};
#endif /* defined(__CPP_Playground__test__) */
和相应的cpp文件
#include "test.h"
void Test::f(int target){
target = 10;
};
但它不起作用。我该如何解决这个问题?
答案 0 :(得分:1)
如果你真的想要像这样破坏const-correctness,那么你将不得不通过引用传递(这样你就可以修改变量,而不是本地副本),并使用邪恶的转换来绕过类型系统防止这种疯狂。
void Test::f(int const &target){
const_cast<int&>(target) = 10;
};
如果引用绑定到const
对象,则会有未定义的行为。
通常,成员函数访问私有变量本身会更有意义;最好通过“getter”函数而不是引用来提供只读访问权限,因为这样就不会在对象中占用额外的存储空间。
(另外,您不应该使用__CPP_Playground__test__
之类的reserved names
答案 1 :(得分:0)
void f(int target);
您要定义要按值传递的参数target
,即作为副本传递。因此,更改target
内的f()
将不会影响您传递给f()
的变量。
为了能够修改传递给函数的对象,该函数需要将该对象作为引用。声明f()
采用参考参数:
void f(int& target);
现在你可以修改传递给函数内部f()
的变量,它也会在函数外部改变。
cout << test.x << endl; // Should be 0.
假。您尚未初始化x_
,因此test.x
的值可以是任何值。这是未定义的。
test.f(test.x);
定义f()
以接受引用变量后,这会导致错误,因为test.x
为const
(即无法修改)和f()
需要非const
参考。