Logo
Section 1 / 6

const 函数

让我们来学习 const 函数及其特性。

导入

const 函数

让我们来学习 const 函数及其特性。

引言

我们是否应该尽可能将成员函数声明为 const?

是的,我们应该!这能明确设计意图,提高代码可读性,并让编译器捕获更多错误。有时甚至还能带来一些优化收益。

const 成员函数

首先,什么是 const 成员函数?

const 成员函数不能修改任何成员变量,也不能调用任何非 const 成员函数。另一方面,const 成员函数可以以多种方式与静态成员变量和函数进行交互。

让我们来分析一下上面这句话:

  • 只有成员函数才能被声明为 const。因为函数的 const 属性与不修改成员变量有关,对于非成员函数来说,这种特性没有意义。
  • const 函数不能修改类的任何成员变量,也不能调用其他非 const 成员函数,否则编译器会报错。

非 const 成员函数

非 const 成员函数不能从 const 函数中被调用。

1class Car { 2public: 3 void foo() const { 4 bar(); // 错误:调用了非 const 函数 5 } 6 7 void bar() { 8 // ... 9 } 10 // ... 11};

非成员变量的非 const 函数

另一方面,const 函数可以调用非成员或外部对象的非 const 函数。例如,它可以调用局部变量上的任意函数。

非成员变量的非 const 函数可以从 const 函数中被调用。

1#include <iostream> 2 3class Passenger { 4public: 5 void fun() { 6 // ... 7 std::cout << "I'm from non-const function."; 8 } 9}; 10 11class Car { 12public: 13 void foo() const { 14 Passenger p; 15 p.fun(); // 这个非 const 调用是合法的,因为操作的是另一个对象 16 } 17 //... 18}; 19 20int main() { 21 Car c; 22 c.foo(); 23}

静态成员

静态函数不能被声明为 const,因为它们无法与成员变量交互。因此,const 函数可以毫无问题地调用静态函数,也可以修改静态成员变量。const 函数可以修改静态成员。

1#include <iostream> 2 3class Car { 4public: 5 void foo() const { 6 ++s_bar; 7 } 8 static int s_bar; 9}; 10 11int Car::s_bar = 5; 12 13int main() { 14 Car c; 15 c.foo(); 16 std::cout << c.s_bar << '\n'; 17}

const 成员变量

const 重载