最近看effective c++ 這本書,發現之前寫的**有很多不好的習慣,之前看過這本書,但是總是對裡面的提的建議忘記,所以記下來加以理解會為未來寫**具有更好的習慣。
特別是const修飾變數,指標等等。之前總是覺得它好麻煩,約束太強了(缺乏對const的理解)。後面發現自己寫的**越多,發現越是難以控制大量**。故再次看一下const並理解。
最常見的就是const修飾變數或者指標,如下:
char greeting=
"hello,world!"
;char
* p = greeting;
//non-const pointer, non-const data
const
char
* data_p = greeting;
//non-const pointer, const data
char
*const point_p = greeting;
//const pointer, non-const data
const
char
*const data_point_p = greeting;
//const pointer, const data
const修飾語句的話,如果修飾指標的話,就需要在()右邊,直接在指標。如果修飾變數的話,需要放在()左邊。我的理解就是對於變數的話指的是* data_p,而指標是data_p;如果想修飾變數,把const放在(*)的左邊,反之亦然。所以有兩種寫法如下:
voidf1(
const widget* pw)
;//f1獲得乙個指標,指向乙個常量的widget物件
void
f2(widget const
*pw)
;//f2也是,和上面一樣
兩者使用功能是一樣的。
修飾指標和修飾變數的差別:
const 修飾指標的時候,指標值是不變的,但是它指向的內容可以變;const 修飾變數的時候指標值可以變,但是它指向的變數不能變。
對於能體現差別的功能如下:
類似於stl中的迭代器,它其實和指標一樣,以指標為根據塑模出來的。所以迭代器的作用就像t* 指標。申明也一樣。但是對於塑模出來的可能跟指標不一樣:const t* 指標和const_iterator對等;t* const和const + iterator,例子如下:
std::vector<
int> vec;
const std::vector<
int>
::iterator iter = vec.
begin()
;//iter的作用像乙個t* const
*iter =10;
//沒有問題,因為改變的知識iter所指物
++iter;
//錯誤,iter是const指標不能改變
std::vector<
int>
::const_iterator citer = vec.
begin()
;//citer的作用就像const t*
*citer =10;
//錯誤,因為citer是const
++citer;
//沒有問題,改變的是citer指標,而不是變數
可以看出來const的功能。但是這個const除了增加了約束,防止亂用指標和變數,還有哪些功能?
之前看過const修飾函式?非常疑惑,如下:
class
rational
;const rational operator*(
const rational& lhs,
const rational& rhs)
;
常常遇到申明這樣,讓返回值不能再改變。
因為有些人可能會這樣寫:
rational a, b, c;
(a*b)
=c;//在a*b的結果上再次呼叫operator=
這樣的非法寫法沒有報錯可能不會被那麼容易檢查到。所以需要const修飾。
同理
if
(a*b=c)..
.
也很致命的寫法,需要報錯,不被允許。
暫且寫這麼多,後續補充…
強烈推薦看effective c++ 這本書,對於寫**的習慣很有作用。
const修飾變數 指標詳解
const常用來修飾普通變數,指標變數,甚至是函式的返回值,可以提高程式的健壯性,其用的最多之處是用來修飾函式的形參,防止修改了呼叫函式中實參指向位址中的資料及在被調函式執行中修改了形參值。本文主要討論c語言中const的使用規則及其含義,下文由淺入深展開討論。基本規則 規則1 const修飾後的變...
const修飾指標
1.指向const資料的非const指標 const int countptr 這個宣告從左到右讀,countptr 是乙個指向整數常量的指標 2.指向非const資料的const指標 int const ptr x 這個ptr指標就是const指標,宣告為const的指標必須在宣告時進行初始化。指...
const修飾指標
書寫形式為 int countptr 特點 指標的指向可以被修改,指向的資料可以被修改 includeint main 書寫形式為 const int countptr 特點 指標的指向可以被修改,指向的資料不能被修改 includevoid func const int int main void...