我知道函数可以返回一个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
答案 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问题,所以在尝试搞乱代码时没有什么意义。