C++ C++;函数常数
我有一门课,我正在用它来帮助理解const的概念。比如说C++ C++;函数常数,c++,class,constants,C++,Class,Constants,我有一门课,我正在用它来帮助理解const的概念。比如说 Class class1: { protected: double * info; public: void set(const int i, const int j, const double val) const { info[i + j] = val; } } 我读过多篇文章说,如果一个类函数不改变任何成员变量,那么在该类函数之后编写const。不管这个类如何工作,它是正确的还
Class class1:
{
protected:
double * info;
public:
void set(const int i, const int j, const double val) const
{
info[i + j] = val;
}
}
我读过多篇文章说,如果一个类函数不改变任何成员变量,那么在该类函数之后编写const。不管这个类如何工作,它是正确的还是错误的
另外,我对常量变量的理解是,如果它们永远不会改变,就将它们设为常量,但这有什么好处吗
谢谢,抱歉,如果这已经在其他地方得到了回答,我似乎无法理解。这有点正确,一个常量
成员函数不会改变内部状态set
显然不会改变指针info
,但会改变指针指向的内容。现在,您必须决定(编译器不能)这是否是const
行为。在大多数情况下,它不会是const行为。此函数不会更改任何成员变量。唯一的成员变量是info
,它不会更改。它确实更改了info
指向的内容,但这不是一个成员变量。因此,就编译器而言,它是合法的
但是,请注意,这可能会让其他程序员(包括你自己)感到困惑——一般来说,
const
函数不应该修改对象的状态。只是为了给已经提供的答案添加一些颜色。使用const
限定函数,所有MEBER有效地变为const。例如,您的信息正在变为常量,其行为就像是这样定义的:
double* const info;
请注意,这与
const double* info;
首先使信息本身不可修改(你不能说info=&d
,但你可以说*info=42
。另一方面,后者意味着信息是可修改的,但不是它指向的地方。你可以写info=&d
,但不能写*info=42
显然,有一种方法可以同时具备这两种特性,即说const double*const info
-这将阻止指针和值的修改。然而,这不是const
-限定对函数所做的。这是直观的吗?我敢说,不是。然而,这就是它,所以我们不得不接受它
显然,有人可能会争辩说,常量限定函数可以使所有成员指针双倍常量,但指针类对象(例如,
唯一的\u ptr
)又如何呢?编译器无法生成这些双常量,因此最好保持一致。这是法律代码。这是否是一个好主意取决于类的整体情况。您没有更改this->info
,而是this->info[索引]
。这是一个巨大的差异。类的类型上的常量
,这意味着你有双*
,那么常量
指的是指针
而不是值
…同样,在你的例子中是的,如果你有另一个值
,比如:int key
,那么const
指的是键的值
…和功能设置
不需要常量
谢谢,一个有用的answer@RaymondTunstill很高兴。如果是这样,请接受这个答案,:)是一个成员变量,类似于双重信息;在课堂上?@RaymondTunstill是的。谢谢你,我知道这是一个简单而愚蠢的问题,我欣赏你的答案的全面性