const成员函数和非const成员函数之间有什么区别?

Yon*_*ing 14 c++

我对const版本和非const版本成员函数非常困惑,如下所示:

value_type& top() { return this.item }
const value_type& top() const { return this.item }
Run Code Online (Sandbox Code Playgroud)

这两个功能有什么区别?在什么情况下他们会被使用?

Ste*_*hen 16

简而言之,它们用于为程序添加"const正确性".

value_type& top() { return this.item }
Run Code Online (Sandbox Code Playgroud)

这用于提供可变访问item.它被使用,因此您可以修改容器中的元素.

例如:

c.top().set_property(5);  // OK - sets a property of 'item'
cout << c.top().get_property();  // OK - gets a property of 'item'
Run Code Online (Sandbox Code Playgroud)

这种模式的一个常见示例是返回对元素的可变访问vector::operator[int index].

std::vector<int> v(5);
v[0] = 1;  // Returns operator[] returns int&.
Run Code Online (Sandbox Code Playgroud)

另一方面:

const value_type& top() const { return this.item }
Run Code Online (Sandbox Code Playgroud)

这用于提供const访问权限item.它比以前的版本更具限制性 - 但它有一个优点 - 你可以在const对象上调用它.

void Foo(const Container &c) {
   c.top();  // Since 'c' is const, you cannot modify it... so the const top is called.
   c.top().set_property(5);  // compile error can't modify const 'item'.
   c.top().get_property();   // OK, const access on 'item'. 
}
Run Code Online (Sandbox Code Playgroud)

要遵循矢量示例:

const std::vector<int> v(5, 2);
v[0] = 5;  // compile error, can't mutate a const vector.
std::cout << v[1];  // OK, const access to the vector.
Run Code Online (Sandbox Code Playgroud)


Jam*_*lis 6

如果在const限定的对象上调用成员函数,则将调用const限定的成员函数.

如果在非const限定的对象上调用成员函数,则将调用非const限定的成员函数.

例如:

MyStack s;
s.top(); // calls non-const member function

const MyStack t;
t.top(); // calls const member function
Run Code Online (Sandbox Code Playgroud)

请注意,在对对象的引用上调用成员函数或通过指向对象的指针时,应用相同的规则:如果指针或引用是const对象,则将调用const成员函数; 否则将调用非const成员函数.