C++ 将只读变量更改为c++;

C++ 将只读变量更改为c++;,c++,C++,我有以下只读变量类的结构(原则取自) 但它不起作用。我怎样才能解决这个问题 void f(int target); 您正在定义要通过值传递的参数target,即作为副本。因此,在f()内部更改target对传递给f()的变量没有影响 为了能够修改传递给函数的对象,函数需要将该对象作为引用。要声明f()以获取引用参数,请执行以下操作: void f(int& target); 现在,您可以在函数内部修改传递给f()的变量,并且它在函数外部也会更改 这将导致在定义f()以接受引用变量后

我有以下只读变量类的结构(原则取自)

但它不起作用。我怎样才能解决这个问题

void f(int target);
您正在定义要通过值传递的参数
target
,即作为副本。因此,在
f()
内部更改
target
对传递给
f()
的变量没有影响

为了能够修改传递给函数的对象,函数需要将该对象作为引用。要声明
f()
以获取引用参数,请执行以下操作:

void f(int& target);
现在,您可以在函数内部修改传递给
f()
的变量,并且它在函数外部也会更改



这将导致在定义
f()
以接受引用变量后出现错误,因为
test.x
const
(即它不能修改),并且
f()
需要一个非
const
引用。

如果您真的想像这样破坏const正确性,那么您必须通过引用进行传递(这样您就可以修改变量,而不是本地副本),并使用邪恶的强制转换来绕过类型系统对这种疯狂行为的保护

void Test::f(int const &target){
    const_cast<int&>(target) = 10;
};
void测试::f(int常量和目标){
常量(目标)=10;
};
如果引用绑定到
const
对象,则这将具有未定义的行为

通常,成员函数访问私有变量本身更有意义;最好通过“getter”函数而不是引用提供只读访问,因为这不会占用对象中的额外存储


(另外,你不应该使用像
\uuuuuucpp\uuuu操场\uuuuuuuu测试\uuuuuuuuu

你需要在构造函数中初始化
x
,并做一些在
测试::f()中实际有影响的事情
。但这就是我的问题:如何更改它以使其产生效果?更改非局部变量的值?请查看
Test::f()
。它在做什么?什么都不做。我如何更改x_uu的值?而不是局部变量,而是目标变量?这样我就可以用const int&y添加一个额外的只读变量int y_u,还可以使用函数f将其值设置为10?
x_uu=10
将是一种方法。
void f(int target);
void f(int& target);
cout << test.x << endl; // Should be 0.
test.f(test.x);
void Test::f(int const &target){
    const_cast<int&>(target) = 10;
};