[C++] 函式的結尾加上 const (const member function)

防呆好幫手 const,放在 class 成員函式的結尾代表什麼意思呢?

Tiffany Chen
82年生的蒂芬妮
4 min readMay 16, 2024

--

Q:在 class 中,函式的結尾加上 const 是什麼意思呢?

A:使這個函式不能改動成員變數,若改動了,在編譯階段會有 error,也就是防呆機制啦。

C++ 中,const 有許多種用法,大體是不能改變,擺在不同地方的意義略有不同,是大型程式開發的好幫手。之前本來想大統整 const 的用法,後來發現沒有正在用的話沒什麼感覺。最近碰到在函式結尾加 const,查一下之後想說筆記起來。本篇分享 const 加在函式結尾的用法,那我們就來看看範例吧!

💡 Contents:
1. 範例
2. 使用時機
3. 總結

1. 範例

先上一個簡單的 class,有一個成員變數 m_var,一個結尾有 const 的成員函式 Print()

● 在函式內讀取成員變數的值

#include <iostream>

class MyClass {
public:
MyClass() {
m_var = 0;
};
void Print() const {
std::cout << "m_var = " << m_var << std::endl;
}
private:
int m_var;
};
int main() {

MyClass myClass;
myClass.Print();
return 0;
}

Output:

m_var = 0

讀取成員變數可以正常編譯正常執行。

● 在函式內改動成員變數的值

那如果動到了成員變數的值會如何呢?

#include <iostream>

class MyClass {
public:
MyClass() {
m_var = 0;
};
void Print() const {
m_var += 1;
std::cout << "m_var = " << m_var << std::endl;
}
private:
int m_var;
};
int main() {

MyClass myClass;
myClass.Print();
return 0;
}

Output:

ERROR!
/tmp/pJEIuYjXRP.cpp: In member function 'void MyClass::Print() const':
/tmp/pJEIuYjXRP.cpp:9:15: error: assignment of member 'MyClass::m_var' in read-only object
9 | m_var += 1;
| ~~~~~~^~~~

如果改動到成員變數的值的話,在編譯階段會出現錯誤,告知在 read-only 的函式改動到成員變數的值啦。

2. 使用時機

現在知道把 const 加在函式結尾的效果了,那麼,什麼情況會用到呢?

const 很多時候加與不加不是「絕對」,不加,程式也不會爆掉,但加了,會讓以後更好維護,讓新看到的人更快理解這個函式的作用,是大型程式開發的好幫手。

● Get() 類型函式

在 class 中,為了保護成員變數,時常用 GetXXX() 來讀取成員變數的值,這種很適合加上 const,代表這個函式就只是讀取用的。當後人需要用這個函式改動成員變數的值的時候,因為看到了 const,會讓他多想一下這樣改好嗎?這樣有破壞原本的用途嗎?還是另外創別的函式呢?

● Print() 類型函式

如同這次的範例,因為只是要印出值,加上 const 後可以避免不小心改動到成員變數的值。

● Bind()、Unbind() 類型函式

在計算機圖學領域中,常常會看到 Bind()Unbind(),使某個 buffer 變成正在使用的,或是取消正在使用的 buffer,這種情況也滿適合的。

3. 總結一下

const 在函式結尾的意思是:

  • 使這個函式變成 read-only function,aka 不能改動成員變數的值
  • 大型程式開發好幫手
  • 防呆撇步 +1

最後,分享一個好用的簡易線上編譯器-C++ Online Compiler。C++ Online Compiler 是線上編輯、編譯 C++ 的網站,如果有小程式想快速試一下的話,推薦可以用這個線上編譯器唷。

-2024.05.16。

想敲碗什麼樣的內容,或資訊有誤/欲補充的話,歡迎在下方留言讓我知道,不好意思公開的話,也歡迎在Google 表單留言 : )

如果覺得文章有幫助的話,也歡迎點擊連結,贊助我一杯咖啡唷☕

--

--

Tiffany Chen
82年生的蒂芬妮

Graphics Software Engineer @ MD。白天是名軟體工程師,晚上偶爾寫寫 blog,2021年秋天跟著 DRT 搬至美國亞利桑那州居住,記錄AZ新鮮人的日常生活&軟體工程筆記。現居MD。