假設我正在編寫一個類來封裝windows的文件HANDLE,以便輕鬆地從文件讀取/寫入文件。該類有一個稱爲read(buffer& out)
的函數,用於從文件中讀取數據。file read()const正確性
問題是,read()
是否需要const
?
一方面,它應該是const
,因爲它不會更改文件。 另一方面,它不應該是const
,因爲它會將HANDLE(HANDLE)更改爲顯示在哪裏閱讀的文件。
您認爲如何?
假設我正在編寫一個類來封裝windows的文件HANDLE,以便輕鬆地從文件讀取/寫入文件。該類有一個稱爲read(buffer& out)
的函數,用於從文件中讀取數據。file read()const正確性
問題是,read()
是否需要const
?
一方面,它應該是const
,因爲它不會更改文件。 另一方面,它不應該是const
,因爲它會將HANDLE(HANDLE)更改爲顯示在哪裏閱讀的文件。
您認爲如何?
不是常量。修改文件句柄的位置。
聽起來像你的班級 - 我會稱之爲FileAccessor
- 有效地編排文件上的操作。假設你想有一個函數實現一些算法處理文件,並且它想通過調用output_diagnostics(const FileAccessor& h)
來顯示一些診斷信息,那麼它可以合理的顯示哪些信息不會干擾調用output_diagnostics
的算法?它也許可以輸出文件中的當前位置/字節偏移量。獲取該位置的函數應該是const
。可能還有其他一些東西,例如文件是否以某種方式鎖定,文件大小或文件系統路徑 - 看起來都是公平的,以便製作const
。但是,如果它從文件中執行了read
,那麼它將修改調用output_diagnostic
的算法的後續操作read
,「從當前位置截斷」以及所有其他操作的方式,因此read
函數應該是不是是const
。
Herb Sutter在幾年前發表了一篇演講,他說C++ 11的「const」意味着線程安全。所以問題是,在沒有任何(客戶端)鎖定的情況下,調用你可以安全地從兩個線程調用'read()'?我懷疑答案是否定的,所以函數不應該是'const'。 –