如何从函数返回一个无法更改的值?

时间:2014-09-06 20:16:06

标签: c++

我知道函数可以返回一个const引用,但还有其他方法可以实现这种行为吗?意思是,我想返回一个无法修改的值。

#include <string>
#include <iostream>    
using namespace std;  

class A {  
public:  
    A( int x, int y): _x(x), _y(y) {};  
    int _x;  
    int _y;  
};  

const A genObjA()
{
    return A( 0,0 );
}

int main(int argc, char **argv) {

    A new_obj = genObjA();
    std::cout << new_obj._x;
    new_obj._x = 10; // user can change new_obj
    std::cout << new_obj._x;

}

这将打印

0
10

3 个答案:

答案 0 :(得分:0)

您不必返回const引用,可以返回const对象。

const Object function_name() {
// ...
}

答案 1 :(得分:0)

您不会修改返回的值,而是修改它的副本。在此代码中,您无法genObjA()._x=10;

要达到目标,您可以编写额外课程:

class A_const{
protected:
    int _x;  
    int _y;
    operator=(const A_base&)=default;
public: 
    A()=default;
    A(const A_base&)=default;
    A( int x, int y): _x(x), _y(y) {};
    int x(){return _x;}
    int y(){return _y;}
    //or
    int get_x(){return _x;}
    int get_y(){return _y;}
};

class A {  
public:
    using A_const::A_const;
    A(const A&)=default;
    int& x(){return _x;}
    int& y(){return _y;}
    //or
    int& set_x(int val){return _x=val;}
    int& set_y(int val){return _y=val;}
};

const A_const genObjA_const(){
    return A_const(0, 0);
}

答案 2 :(得分:0)

如果您想要一个万无一失的修改保护措施,您可以使用PIMPL成语。

但是,如果您对与您的班级一起工作的同事的理智有合理的信心,那么只需使用const-reference。如果您想确定,请记录为什么您不希望修改对象的原因,以便您的同伴可以按照您的想法(并得出相同的结论)。 PIMPL习语试图将你从确定的傻瓜中拯救出来。但是确定的傻瓜甚至可以解决PIMPL问题,所以在尝试搞乱代码时没有什么意义。