我对c ++中的oop很新,我在浏览网页时遇到了以下代码:
#include<iostream>
using namespace std;
class cls
{int x;
public:
cls(int i=3) {x=i;}
int &f() const{ return x;}
};
int main()
{
const cls a(-3);
int b=a.f();
cout<<b;
return 0;
}
当我尝试运行代码时,它会因f函数而崩溃。现在我不太确定那里发生了什么以及为什么会崩溃,所以我需要有人在这个问题上给我一些启发。
答案 0 :(得分:4)
由于您的函数已声明为const
,因此除非您将其标记为const
,否则无法向成员变量返回非mutable
引用。
要修复代码,请写
class cls
{
mutable int x;
// ^^^^^^^
public:
cls(int i=3) {x=i;}
int &f() const{ return x;}
};
或返回const
引用。
class cls
{
int x;
public:
cls(int i=3) {x=i;}
const int &f() const{ return x;}
// ^^^^^
};
使用mutable
需要花费一些时间,它会破坏你的类的封装,并允许通过你发出的参考来改变你的类内部。
答案 1 :(得分:1)
您无法向const
返回非const
引用。 const
成员函数在访问变量时x
非const
。
似乎没有必要返回引用,事实上这是一个不好的做法。如果您需要更改内部int
,则添加setter会更有意义:
class cls
{
int x;
public:
cls(int i=3) { set(i); }
void set (const int val) { x=val; }
int f() const{ return x; }
};