将只读变量更改为c ++中的目标

时间:2015-02-09 12:08:37

标签: c++

我有一个类的以下结构用于只读变量(原则取自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;
};

但它不起作用。我该如何解决这个问题?

2 个答案:

答案 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.xconst(即无法修改)和f()需要非const参考。