Posted on 2011-07-26 07:13
RTY 閱讀(229)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++ 、
轉(zhuǎn)載隨筆 、
需要注意的
const類型定義:指明變量或?qū)ο蟮闹凳遣荒鼙桓?引入目的是為了取代預(yù)編譯指令
**************常量必須被初始化*************************
cons的作用
(1)可以定義const常量 例如:
const int Max=100;
int Array[Max];
(2)便于進(jìn)行類型檢查 例如:
void f(const int i) { .........}
編譯器就會(huì)知道i是一個(gè)常量,不允許修改;
(3)可以保護(hù)被修飾的東西,防止意外的修改,增強(qiáng)程序的健壯性。
還是上面的例子,如果在函數(shù)體內(nèi)修改了i,編譯器就會(huì)報(bào)錯(cuò);
例如:
void f(const int i) { i=10;//error! }
(5) 為函數(shù)重載提供了一個(gè)參考。
class A
{
......
void f(int i) {......} file://一個(gè)函數(shù)
void f(int i) const {......} file://上一個(gè)函數(shù)的重載
......
};
(6) 可以節(jié)省空間,避免不必要的內(nèi)存分配。
例如:
#define PI 3.14159 file://常量宏
const doulbe Pi=3.14159; file://此時(shí)并未將Pi放入ROM中
......
double i=Pi; file://此時(shí)為Pi分配內(nèi)存,以后不再分配!
double I=PI; file://編譯期間進(jìn)行宏替換,分配內(nèi)存
double j=Pi; file://沒有內(nèi)存分配
double J=PI; file://再進(jìn)行宏替換,又一次分配內(nèi)存!
const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在程序運(yùn)行過程中只有一份拷貝,而#define定義的常量在內(nèi)存中有若干個(gè)拷貝。
(7) 提高了效率。
編譯器通常不為普通const常量分配存儲(chǔ)空間,而是將它們保存在符號表中,這使得它成為一個(gè)編譯期間的常量,沒有了存儲(chǔ)與讀內(nèi)存的操作,使得它的效率也很高。
使用const
(1)修飾一般常量,常數(shù)組,常對象
修飾符const可以用在類型說明符前,也可以用在類型說明符后。 例如:
int const x=2; 或 const int x=2;
int const a[5]={1, 2, 3, 4, 5}; 或 const int a[5]={1, 2, 3, 4, 5};
class A; const A a; 或 A const a;
(2)修飾指針
const int *A; 或 int const *A; //const修飾指向的對象,A可變,A指向的對象不可變
int *const A; //const修飾指針A, A不可變,A指向的對象可變
const int *const A; //指針A和A指向的對象都不可變
(3)修飾引用
const double & v; 該引用所引用的對象不能被更新
(4)修飾函數(shù)的返回值:
const修飾符也可以修飾函數(shù)的返回值,是返回值不可被改變,格式如下:
const int Fun1();
const MyClass Fun2();
(5)修飾類的成員函數(shù):
const修飾符也可以修飾類的成員函數(shù),格式如下:
class ClassName
{
public:
int Fun() const;
.....
};
這樣,在調(diào)用函數(shù)Fun時(shí)就不能修改類里面的數(shù)據(jù)
(6)在另一連接文件中引用const常量
extern const int i; //正確的引用
extern const int j=10; //錯(cuò)誤!常量不可以被再次賦值
*******************放在類內(nèi)部的常量有什么限制?
class A
{
private:
const int c3 = 7; // err
static int c4 = 7; // err
static const float c5 = 7; // err
......
};
初始化類內(nèi)部的常量
1 初始化列表:
class A
{
public:
A(int i=0):test(i) {}
private:
const int i;
};
2 外部初始化,例如:
class A
{
public:
A() {}
private:
static const int i;
};
const int A::i=3;