Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;函数常数_C++_Class_Constants - Fatal编程技术网

C++ C++;函数常数

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。不管这个类如何工作,它是正确的还

我有一门课,我正在用它来帮助理解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是的。谢谢你,我知道这是一个简单而愚蠢的问题,我欣赏你的答案的全面性