再舉個 STL 容器的例子,使用 std::queue 容器 將 1、2、3 元素推入後,之後使用 front() 取得頭部元素,這時我們只是需要把變數 n 印出來而已,所以不會對它進行修改,如果嘗試對 const int &n 修改的話會得到編譯錯誤的 error: cannot assign to variable 'n' with const-qualified type 'const int &' 訊息,
另外宣告 int &n2 = q.front(); 參考的方式來修改 queue 頭部元素,之後 n 裡面的數值也會跟著改變,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#include<iostream> #include<queue>
intmain(){ std::queue<int> q; q.push(1); q.push(2); q.push(3); constint &n = q.front(); // n = 5; compile error std::cout << n << "\n"; int &n2 = q.front(); n2 = 4; std::cout << n << "\n"; return0; }
輸出結果如下,
1 2
1 4
C++ const 加在成員函式後面的用法
這邊介紹 C++ const 加在成員函式後面的用法,const 加在成員函式後面表示不能在該成員函式裡修改類別成員變數,因為該函式裡的存取類別成員都會是 read-only,範例如下,
如果在 getCounter() 成員函式裡嘗試對 counter 進行修改會得到編譯錯誤(error: increment of member ‘Object::counter’ in read-only object),對其它類別成員 number 修改也是會得到編譯錯誤(error: assignment of member ‘Object::number’ in read-only object),但是對 getCounter() 裡宣告的 number2 區域變數可以進行修改,
try: f = open('xxx.txt', 'r') text = f.read() print(text) except: print('error') finally: f.close()
但這樣寫太繁瑣了,每次讀檔或寫檔都樣寫這樣的程式碼的話顯得很冗長。
好在 Python 提供了 with open 語句來解決這個問題,使用 Python with open 語句可以自動地幫我們呼叫 close() 關檔的動作,即使在 Python with open 語句裡發生例外也是一樣,而且這也是官方建議使用的方式,我們來看看 Python with open 語句怎麼寫,將上述範例改用 Python with open 語句後如下列範例所示,
1 2 3 4 5 6
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
with open('xxx.txt', 'r') as f: text = f.read() print(text)
這寫法跟前述範例的 try… finially 寫法效果是一樣的,但是 Python with open 語句的程式碼明顯地更精簡更少,而且還不用呼叫 close() 函式關檔。