为什么这个 const 成员函数允许修改成员变量?

2022-01-23 00:00:00 constants c++
class String
{

    private:
        char* rep;

    public:
        String (const char*);
        void toUpper() const;
};


String :: String (const char* s)
{
    rep = new char [strlen(s)+1];
    strcpy (rep, s);
}


void String :: toUpper () const
{
    for (int i = 0; rep [i]; i++)
    rep[i] = toupper(rep[i]);
}


int main ()
{
    const String lower ("lower");
    lower.toUpper();

    cout << lower << endl;
    return 0;
}

推荐答案

一个const成员函数,是一个不改变其成员变量的成员函数.

成员函数上的 const 并不意味着 const char *.这意味着您无法更改指针所在地址中的数据.

您的示例不会改变成员变量本身.

Your example does not mutate the member variables themselves.

成员函数上的 const 将确保您将所有成员变量视为 const.

A const on a member function, will ensure that you treat all of your member variables as const.

这意味着如果你有:

int x;
char c;
char *p;

那么你将拥有:

const int x;
const char c;
char * const p; //<-- means you cannot change what p points to, but you can change the data p points to

有两种类型的 const 指针.一个 const 成员函数使用我上面列出的那个.

There are 2 types of const pointers. A const member function uses the one I've listed above.

获取所需错误的方法:

尝试改变:

char * rep;

到:

char rep[1024];

并删除这一行:

rep = new char [strlen(s)+1];

它会抛出你所期望的错误(由于 const 关键字不能修改成员)

It will throw the error you are expecting (can't modify members because of const keyword)

因为只有 1 种类型的 const 数组.这意味着您无法修改其任何数据.

Because there is only 1 type of const array. And that means you cannot modify any of its data.

现在整个系统实际上被下面的例子破坏了:

Now the whole system is actually broken with the following example:

class String
{

    private:
        char rep2[1024];
        char* rep;

 ...


 String :: String (const char* s)
 {
    rep = rep2;
    strcpy (rep, s); 
 }

所以这里要吸取的教训是成员函数上的 const 关键字并不能确保你的对象根本不会改变.

它只确保每个成员变量都将被视为 const.而对于指针,const char * 和 char * const 之间存在很大差异.

It only ensures that each member variable will be treated as const. And for pointers, there is a big diff between const char * and char * const.

大多数时候,一个 const 成员函数意味着该成员函数不会修改对象本身,但并非总是如此,如上例所示.

Most of the time a const member function will mean that the member function will not modify the object itself, but this is not always the case, as the above example shows.

相关文章