一、const用在函數(shù)中:
十年的淮陰網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營(yíng)銷(xiāo)網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶(hù)設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整淮陰建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“淮陰網(wǎng)站設(shè)計(jì)”,“淮陰網(wǎng)站推廣”以來(lái),每個(gè)客戶(hù)項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
注意:const 類(lèi)型只能賦值給const類(lèi)型
如下幾種運(yùn)用方式
A& operator=(const A& a);
void fun0(const A* a );
void fun1( ) const; // fun1( ) 為類(lèi)成員函數(shù)
const A fun2( );
const 用在函數(shù)的返回類(lèi)型中,一般情況下,不用這種返回類(lèi)型。
const A fun2( );
2.類(lèi)的成員函數(shù)后面加 const,表明這個(gè)函數(shù)不會(huì)對(duì)這個(gè)類(lèi)對(duì)象的數(shù)據(jù)成員(準(zhǔn)確地說(shuō)是非靜態(tài)數(shù)據(jù)成員)作任何改變。 void fun1( ) const;
在設(shè)計(jì)類(lèi)的時(shí)候,一個(gè)原則就是對(duì)于不改變數(shù)據(jù)成員的成員函數(shù)都要在后面加 const,而對(duì)于改變數(shù)據(jù)成員的成員函數(shù)不能加 const。所以 const 關(guān)鍵字對(duì)成員函數(shù)的行為作了更加明確的限定:有 const 修飾的成員函數(shù)(指 const 放在函數(shù)參數(shù)表的后面,而不是在函數(shù)前面或者參數(shù)表內(nèi)),只能讀取數(shù)據(jù)成員,不能改變數(shù)據(jù)成員;沒(méi)有 const 修飾的成員函數(shù),對(duì)數(shù)據(jù)成員則是可讀可寫(xiě)的。
除此之外,在類(lèi)的成員函數(shù)后面加 const 還有什么好處呢?那就是常量(即 const)對(duì)象可以調(diào)用 const 成員函數(shù),而不能調(diào)用非const修飾的函數(shù)。
#include
using namespace std;
class A{
public:
A(int a=0 ,int b=0 );
const A& operator=(const A& a);
friend ostream& operator<<(ostream &os, const A& a);
friend const A operator+(const A& a, const A& b);
void setA(int ,int );
int getb()const{ return b; }//一般情況不修改數(shù)據(jù)成員的函數(shù)都要修飾成cosnt
int getc()const{ return c; }
private:
int b, c;
};
const A operator+(const A &x, const A& y){//這里聲明返回類(lèi)型中加上const目的
//防止a+b=c.這種情況通過(guò)
A m;
m.b = x.b + y.b;
m.c = x.c + y.b;
return m;
}
ostream& operator<<(ostream &os, const A& a){
os << a.b << endl;
os << a.c << endl;
return os;
}
A::A(int m, int n){ setA(m, n); }
void A::setA(int m,int n){
b = m;
c = n;
}
const A& A::operator =(const A& a){//一般不加const
b = a.b;
c = a.c;
return *this;
}
const A& max(const A& v1, const A& v2){//這里參數(shù)都被聲明為const引用。所以返回值也為
//const 修飾的類(lèi),只能調(diào)用const修飾的函數(shù)!
if (v1.getb()>v2.getb()){ return v1; }
else
{
return v2;
}
}
int main(){
const int s = 2;//聲明一個(gè)變量時(shí)必須進(jìn)行初始化
//const int d;報(bào)錯(cuò)must be initialed if not extern;
A a(2,3), b, c;
c=b=a;
//(c = b) = a;錯(cuò)誤的因?yàn)椋╟=b)返回一個(gè)const值無(wú)法在被賦值。
cout <<"第一次\n"<< a<
b.setA(10, 5);
c = max(b, c);
cout << "第二次\n"< c = a + b; //a + b = c;這里a+b返回類(lèi)型被聲明為const A ,所以創(chuàng)建的對(duì)象不可以被賦值。 system("pause"); return 0; } 二、const 用在變量中 1.const 修飾的全局變量是具有內(nèi)部鏈接性!在這點(diǎn)上與static 修飾全局變量相似。 2.const修飾變量一般有兩種方式:const T *a,或者 T const *a 看*號(hào)的位置:const T *a 指一個(gè)指針a 指向 const修飾的 T類(lèi)型變量。 a可以被賦值但是 *a就不可以復(fù)制。 #include using namespace std; int main(){ const int v1 = 3; //int * p1 = &v1;錯(cuò)誤的,因?yàn)椴荒苄薷?,你用一個(gè)指向可以修改的int型的指針肯定不可以 int v2 = 3; const int *p2 = &v2; //很微妙,不可以用*p2修改v2。 //*p2 = 2;錯(cuò)誤 v2 = 4;//正確; const int v3 = 3; const int *p3 = &v3;//這種情況下通過(guò)*p3 或v3都無(wú)法修改v3的值。 //v3 = 4;錯(cuò)誤 //*p3 = 4;錯(cuò)誤 p3 = p3 + 1;//這個(gè)卻可以編譯通過(guò) const int v4 = 3; const int * const p4 = &v4; //p4 = p4 + 1;invalid p4指針的指向 不允許改變 } 3.const 變量聲明時(shí)必須初始化。 但是若是在類(lèi)里聲明的注意:因?yàn)轭?lèi)可以創(chuàng)建多個(gè)對(duì)象,不同的對(duì)象其const數(shù)據(jù)成員的值可以不同。所以不能在類(lèi)聲明中初始化const數(shù)據(jù)成員 class A 三、 const 的好處: 可以避免不必要的內(nèi)存分配
{
const int size = 100; //錯(cuò)誤
int array[size]; //錯(cuò)誤,未知的size
}
#define STRING "abcdefghijklmn\n"
const char string[]="abcdefghijklm\n";
...
printf(STRING); //為STRING分配了第一次內(nèi)存
printf(string); //為string一次分配了內(nèi)存,以后不再分配
...
printf(STRING); //為STRING分配了第二次內(nèi)存
printf(string);
...
由于const定義常量從匯編的角度來(lái)看,只是給出了對(duì)應(yīng)的內(nèi)存地址,
而不是象#define一樣給出的是立即數(shù),所以,const定義的常量在
程序運(yùn)行過(guò)程中只有一份拷貝,而#define定義的常量在內(nèi)存中有
若干個(gè)拷貝。
分享名稱(chēng):const的用法總結(jié)
文章URL:http://weahome.cn/article/gedsop.html