const在C++中是很常使用的修飾字,其原本的意義是指「不會被修改」也就是read only的意思。但是隨著其放在不同的地方,而有不同的功能。其中const pointer最容易被搞混,要特別注意。
-
const value
const int value = 100;value這個變數是read only,在程式當中不可以被修改。
許多書上建議使用這個方法加上inline來取代macro。 -
const member value
class A{
const int value;
…
};const member value只在object的生存期間是常數,而對於整個class而言是可變的,因為class可以創建多個instance,不同的instance其const member value可以為不同值。所以不能在class declaration初使化consta member value,因為在instance尚未被建立時,compiler不知道const member value之值。
要初使用const int value,必須使用constructor:A(int val=0):value(val){}
想要建立在所有instance都相同的常數,可使用enum或者static const來實作:class A{
enum{size = 100};
const int value = 200;
int array[size];
int array2[value];
}; -
const pointer
int value = 500;
/*a, b兩種語法是相同的,因為const都在「*」的左邊,
代表pointer所指向的值是常數,但是pointer可以指向其它不同的值,
Ex: a=&another;
*/
const int *a = &value;
int const *b = &value;
/*
const在「*」的右邊,代表pointer本身是常數,
即pointer不可指向其它不同的 值,但是值本身是可變的。
Ex:value = 300;
*/
int* const c = &value;
/*
pointer所指向的值是常數,且pointer本身也是常數,兩者皆是read only
*/
const int* const d= &value;this pointer本身不可指向其它不同的object,但是其指向的object之值是可以改變的。
-
const member function
class A{
…
void print() const{…}
};
const member function是C++特有的語法,是指此member function不會改變任何member data,若是在 function中改變了member data,compile時會傳回error。 -
const references
void function(const &value){...}使用const reference可以避免在傳遞argument使用call by value的方式,在傳遞物件時比較有效率且可以保證所傳遞的值在function中不會被修改。
-
argument passing
const int value = 10;
void print(int val){…}
print(value);
可將const variable傳入non-const argument,會自動轉型。同理non-const variable傳入const argument也會自動轉型。 -
const_iterator, const_reverse_iterator
vector<int> vec;
vector<int>::const_iterator iter;
vector<int>::const_reverse_iterator riter;
當STL container的資料為read only時,應使用const iterator以避免修改到資料。