1.修飾類的數(shù)據(jù)成員
const數(shù)據(jù)成員只是在某個對象的生命周期內(nèi)是常量.如果創(chuàng)建多個對象,那么每個對象的const數(shù)據(jù)成員可以不一樣.所以,不能在類聲明中初始化const數(shù)據(jù)成員.如:
class A
{
???const int size = 100;//?錯誤
???int array[size];//錯誤,未知的數(shù)組大小
}
const類數(shù)據(jù)成員,只能在類的構(gòu)造函數(shù)的初始化列表中進行.要想建立整個類都是恒定的常量的數(shù)據(jù),可以用類中的枚舉.如:
class A
{
enum {size1 = 100, size2 = 200};
int array[size1];
}
2.只有聲明為const的成員函數(shù)才能被一個const對象調(diào)用
3.在另一連接文件中引用const常量.
extern const int i
4.對于const對象,c++既允許對其進行靜態(tài)初始化,也允許對其進行動態(tài)初始化.const對象具有從構(gòu)造函數(shù)完成到析構(gòu)函數(shù)執(zhí)行之前的不變性.
5.常量與數(shù)組的組合有什么特殊嗎?
我們給出下面的代碼:
const int size[3]={10,20,50};
int array[size[2]];
編譯通不過!為什么呢?const可以用于集合,但編譯器不能把一個集合存放在它的符號表里,所以必須分配內(nèi)存。在這種情況下,const意味著“不能改變的一塊存儲”。然而,其值在編譯時不能被使用,因為編譯器在編譯時不需要知道存儲的內(nèi)容。自然,作為數(shù)組的大小就不行了
你再看看下面的例子:
class A
{
public:
A(int i=0):test[2]({1,2}) {} file://你/認為行嗎?
private:
const int test[2];
};
C++標準有一個規(guī)定,不允許無序?qū)ο笤陬悆?nèi)部初始化,數(shù)組顯然是一個無序的,所以這樣的初始化是錯誤的!對于他,只能在類的外部進行初始化,如果想讓它通過,只需要聲明為靜態(tài)的,然后初始化。
這里我們看到,常量與數(shù)組的組合沒有什么特殊!一切都是數(shù)組惹的禍!
(7)什么情況下為const分配內(nèi)存?
以下是我想到的可能情況,當(dāng)然,有的編譯器進行了優(yōu)化,可能不分配內(nèi)存。
A、作為非靜態(tài)的類成員時;
B、用于集合時;
C、被取地址時;
D、在main函數(shù)體內(nèi)部通過函數(shù)來獲得值時;
E、const的 class或struct有用戶定義的構(gòu)造函數(shù)、析構(gòu)函數(shù)或基類時;。
F、當(dāng)const的長度比計算機字長還長時;
G、參數(shù)中的const;
H、使用了extern時。
(8)與static搭配會不會有問題?
假設(shè)有一個類:
class A
{
public:
......
static void f() const { ......}
......
};
我們發(fā)現(xiàn)編譯器會報錯,因為在這種情況下static不能夠與const共存!因為static沒有this指針,但是const修飾this指針.
(9)如何修改常量?
有時候我們卻不得不對類內(nèi)的數(shù)據(jù)進行修改,但是我們的接口卻被聲明了const,那該怎么處理呢?我對這個問題的看法如下:
1)標準用法:mutable
class A
{
public:
A(int i=0):test(i) { }
void Setvalue(int i)const { test=i; }
private:
mutable int test; file://這/里處理!
};
2)強制轉(zhuǎn)換:const_cast
class A
{
public:
A(int i=0):test(i) { }
void Setvalue(int i)const
{ const_cast <int>(test)=i; }//這里處理!
private:
int test;
};
(10)最后我們來討論一下常量對象的動態(tài)創(chuàng)建。
既然編譯器可以動態(tài)初始化常量,就自然可以動態(tài)創(chuàng)建,例如:
const int* pi=new const int(10);
這里要注意2點:
1)const對象必須被初始化!所以(10)是不能夠少的。
2)new返回的指針必須是const類型的。
那么我們可不可以動態(tài)創(chuàng)建一個數(shù)組呢?
答案是否定的,因為new內(nèi)置類型的數(shù)組,不能被初始化。
const數(shù)據(jù)成員只是在某個對象的生命周期內(nèi)是常量.如果創(chuàng)建多個對象,那么每個對象的const數(shù)據(jù)成員可以不一樣.所以,不能在類聲明中初始化const數(shù)據(jù)成員.如:
class A
{
???const int size = 100;//?錯誤
???int array[size];//錯誤,未知的數(shù)組大小
}
const類數(shù)據(jù)成員,只能在類的構(gòu)造函數(shù)的初始化列表中進行.要想建立整個類都是恒定的常量的數(shù)據(jù),可以用類中的枚舉.如:
class A
{
enum {size1 = 100, size2 = 200};
int array[size1];
}
2.只有聲明為const的成員函數(shù)才能被一個const對象調(diào)用
3.在另一連接文件中引用const常量.
extern const int i
4.對于const對象,c++既允許對其進行靜態(tài)初始化,也允許對其進行動態(tài)初始化.const對象具有從構(gòu)造函數(shù)完成到析構(gòu)函數(shù)執(zhí)行之前的不變性.
5.常量與數(shù)組的組合有什么特殊嗎?
我們給出下面的代碼:
const int size[3]={10,20,50};
int array[size[2]];
編譯通不過!為什么呢?const可以用于集合,但編譯器不能把一個集合存放在它的符號表里,所以必須分配內(nèi)存。在這種情況下,const意味著“不能改變的一塊存儲”。然而,其值在編譯時不能被使用,因為編譯器在編譯時不需要知道存儲的內(nèi)容。自然,作為數(shù)組的大小就不行了
你再看看下面的例子:
class A
{
public:
A(int i=0):test[2]({1,2}) {} file://你/認為行嗎?
private:
const int test[2];
};
C++標準有一個規(guī)定,不允許無序?qū)ο笤陬悆?nèi)部初始化,數(shù)組顯然是一個無序的,所以這樣的初始化是錯誤的!對于他,只能在類的外部進行初始化,如果想讓它通過,只需要聲明為靜態(tài)的,然后初始化。
這里我們看到,常量與數(shù)組的組合沒有什么特殊!一切都是數(shù)組惹的禍!
(7)什么情況下為const分配內(nèi)存?
以下是我想到的可能情況,當(dāng)然,有的編譯器進行了優(yōu)化,可能不分配內(nèi)存。
A、作為非靜態(tài)的類成員時;
B、用于集合時;
C、被取地址時;
D、在main函數(shù)體內(nèi)部通過函數(shù)來獲得值時;
E、const的 class或struct有用戶定義的構(gòu)造函數(shù)、析構(gòu)函數(shù)或基類時;。
F、當(dāng)const的長度比計算機字長還長時;
G、參數(shù)中的const;
H、使用了extern時。
(8)與static搭配會不會有問題?
假設(shè)有一個類:
class A
{
public:
......
static void f() const { ......}
......
};
我們發(fā)現(xiàn)編譯器會報錯,因為在這種情況下static不能夠與const共存!因為static沒有this指針,但是const修飾this指針.
(9)如何修改常量?
有時候我們卻不得不對類內(nèi)的數(shù)據(jù)進行修改,但是我們的接口卻被聲明了const,那該怎么處理呢?我對這個問題的看法如下:
1)標準用法:mutable
class A
{
public:
A(int i=0):test(i) { }
void Setvalue(int i)const { test=i; }
private:
mutable int test; file://這/里處理!
};
2)強制轉(zhuǎn)換:const_cast
class A
{
public:
A(int i=0):test(i) { }
void Setvalue(int i)const
{ const_cast <int>(test)=i; }//這里處理!
private:
int test;
};
(10)最后我們來討論一下常量對象的動態(tài)創(chuàng)建。
既然編譯器可以動態(tài)初始化常量,就自然可以動態(tài)創(chuàng)建,例如:
const int* pi=new const int(10);
這里要注意2點:
1)const對象必須被初始化!所以(10)是不能夠少的。
2)new返回的指針必須是const類型的。
那么我們可不可以動態(tài)創(chuàng)建一個數(shù)組呢?
答案是否定的,因為new內(nèi)置類型的數(shù)組,不能被初始化。