C++函数构造

C++ Function Const

本文关键字:函数 C++      更新时间:2023-10-16

我有一个类,我正在使用它来尝试并帮助理解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限定函数,所有成员都有效地成为常量。例如,您的信息正在变为const,其行为就像它是这样定义的:

double* const info;

注意,这与不同

const double* info;

首先使信息本身不可修改(你不能说info = &d,但你可以*info = 42。另一方面,后一个意味着信息是可修改的,但不能指向它所指向的位置。你可以info = &d,但不能写*info = 42

显然,有一种方法可以同时具有这两种性质,即说const double* const info-,这将防止修改指针和值。然而,这并不是const-资格对功能所做的。这是直观的吗?我敢说,事实并非如此。然而,事实就是这样,所以我们必须接受它。

显然,有人可能会争辩说,const限定函数可以使所有成员指针都是const的两倍,但类似指针的对象(比如unique_ptr)呢?编译器不可能使这些双常量,所以最好是一致的。

此函数不会更改任何成员变量。唯一的成员变量是info,它不会更改。它确实改变了info指向的东西,但这不是成员变量。因此,就编译器而言,这是合法的。

然而,请注意,这可能会让其他程序员(包括六个月后的您自己)感到困惑——通常,const函数不应该修改对象的状态。

有点是正确的,const成员函数不会改变内部状态。set显然不会改变指针info,但会改变它指向的内容。现在你必须决定(编译器不能)这是否是const的行为。在大多数情况下,它不会是const行为。