[C++] 函式的結尾加上 const (const member function)
防呆好幫手 const,放在 class 成員函式的結尾代表什麼意思呢?
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 表單留言 : )
如果覺得文章有幫助的話,也歡迎點擊連結,贊助我一杯咖啡唷☕