C++中const和非const函数的区别

6

我一直在阅读一本C++书籍,并找到了这两个函数:

    int &Array::operator []( int subscript ) // first
        {
            //code

            return ptr[ subscript ]; 
         }

 int Array::operator[]( int subscript ) const //second
{
    //code

    return ptr[ subscript ]; // value return
}

这个想法是创建一个数组对象并访问一些私有成员,例如:

Array myArray;
cout << myArray[ 2 ];

但我不理解这些函数之间的区别,因为每次我键入像“cout << myArray[ 2 ]”这样的代码时,第一个函数都会被调用。那么第二个函数是在什么时候被调用的?第二个函数有用吗?


尝试使用 const Array myArray 会怎样? - tadman
1
是的!就是这样,谢谢。 - Beats2019
试试定义两个函数 void c(const Array&a); 和 void v(Array& a); 然后看每个函数内部哪一个被调用了。 - QuentinUK
2个回答

5

如果您声明了一个可变的Array实例,那么将使用第一个函数。

要使用第二个函数,您需要一个const实例:

const Array myArray;

// As this is const, only the second function can work
cout << myArray[2];

如果你仔细阅读函数签名,第二个函数在末尾有一个 "const",这意味着它适用于 "const" 实例。通常情况下,如果没有定义非 "const" 版本,就会运行这个版本,但是因为你特意创建了另一个版本,所以调用的就是那个版本。
第一个函数允许变异,因为它返回一个引用而不是一个副本:
myArray[2] = 5;

这将实际更改数组。而使用 const 关键字则不允许更改,只能获得一个临时值。


我会实际上让它返回一个const引用。使用OP的方式,即使更改立即被丢弃,它看起来仍然会发生变异。 - Lightness Races in Orbit

0
在非静态函数后面加上const可以限定该函数中的this指针。因此,在该函数中出现的成员变量是不能被修改的。 const-qualified member functions提供了更多相关细节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接