1. const
- 常量變量
const 類型說(shuō)明符 變量名
const int num = 1; // 在定義num后贪磺,不能對(duì)該變量進(jìn)行修改
- 常引用
const 類型說(shuō)明符 &引用名
const int &num = a;
num = 1; //錯(cuò)誤
a = 1; // 正確
/* 注意:
在什么時(shí)候使用常引用:如果既要利用引用提高程序的效率坯苹,又要保護(hù)傳遞給函數(shù)的數(shù)據(jù)不在
函數(shù)中被改變参咙,就應(yīng)使用常引用
*/
- 常對(duì)象
類名 const 對(duì)象名 或者 const 類名 對(duì)象名
class A
{
private:
int a;
public:
A(int b){a = b;}
};
A const A_num(5);
// const A A_num(5); 和上面的那個(gè)常對(duì)象是等價(jià)的
/*
注意:
1. 在定義常對(duì)象的時(shí)候,必須要有初值
2. 如果定義常對(duì)象惰赋,則不能調(diào)用該對(duì)象中非const成員函數(shù)(系統(tǒng)隱式調(diào)用的構(gòu)造函數(shù)和
析構(gòu)函數(shù))
3. 增加數(shù)據(jù)的安全性宰掉,防止誤操作而改變相關(guān)數(shù)據(jù)
4. 常對(duì)象的成員數(shù)據(jù)都是常成員數(shù)據(jù),因此常對(duì)象的構(gòu)造函數(shù)只能用參數(shù)初始化表對(duì)常數(shù)
據(jù)成員進(jìn)行初始化赁濒。*/
- 常成員數(shù)據(jù)
const 數(shù)據(jù)類型 常量名
class A
{
private:
const int num;
// 常成員數(shù)據(jù)賦初值
A(int num1){num = num1;} //錯(cuò)誤
A(int num1):num(num1){} //正確
/*常成員數(shù)據(jù)的作用和用法與普通常量變量相似轨奄,用關(guān)鍵字const來(lái)聲明常數(shù)據(jù)成員。常數(shù)據(jù)
成員的值是不能改變的拒炎。*/
}挪拟;
- 常成員函數(shù)
類名::fun(形參) const
class A
{
private:
int num_a;
int num_b;
int sum;
public:
A(int a = 5, int b = 6){num_a = a; num_b = b;sum = 0;}
void sum_num() const;
}
A::void sum_num() const
{
sum = sum_a + sum_b;
}
/*注意:
1. const是函數(shù)類型的一部分,在聲明函數(shù)和定義函數(shù)時(shí)都要有const關(guān)鍵字击你,
在調(diào)用時(shí)不必加const玉组;
2. 常成員函數(shù)可以引用const數(shù)據(jù)成員,也可以引用非const的數(shù)據(jù)成員丁侄。
const數(shù)據(jù)成員可以被const成員函數(shù)引用惯雳,也可以被非const的成員函數(shù)引用。
*/
- 常數(shù)組
類型說(shuō)明符 const 數(shù)組名[大小]
int const arr[10];
- 常指針
const 類型說(shuō)明符 指針名* 或者 類型說(shuō)明符 const 指針名*
const int *p;
int const *p;
[ const使用場(chǎng)景 ]
const修飾普通變量(例如:全局鸿摇、局部變量)石景;
const修飾函數(shù)形參,一般和引用同時(shí)使用;
const修飾函數(shù)返回值潮孽;
const修飾類數(shù)據(jù)成員揪荣,必須在構(gòu)造函數(shù)的初始化列表中初始化;
const修飾類成員函數(shù)往史,實(shí)際修飾隱含的this变逃,表示在類中不可以對(duì)類的任何成員進(jìn)行修改;
在const修飾的成員函數(shù)中要對(duì)類的某個(gè)數(shù)據(jù)成員進(jìn)行修改怠堪,該數(shù)據(jù)成員定義聲明是必須加mutable關(guān)鍵字。
const修飾this指針不能改變
const對(duì)象可以調(diào)用非const成員函數(shù)和const成員函數(shù)嗎名眉?
不能粟矿,調(diào)用非const成員函數(shù)(如果調(diào)用非const則與const相矛盾);
可以损拢,調(diào)用const成員函數(shù)陌粹。
非const對(duì)象可以調(diào)用非const成員函數(shù)和const成員函數(shù)嗎?
都可以調(diào)用福压。
const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)和非const成員函數(shù)嗎掏秩?
不能,調(diào)用其它的非const成員函數(shù)荆姆;
可以蒙幻,調(diào)用其它的const成員函數(shù)。
非const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)和非const成員函數(shù)嗎胆筒?
都可以調(diào)用邮破。
2. static
static的最主要功能是隱藏,其次因?yàn)閟tatic變量存放在靜態(tài)存儲(chǔ)區(qū)仆救,所以它具備持久性和默認(rèn)值0抒和。
static在C和C++中的區(qū)別:
C語(yǔ)言:
1。變量會(huì)被放在程序的全局存儲(chǔ)區(qū)中彤蔽,這樣可以在下一次調(diào)用的時(shí)候還可以保持原來(lái)的賦值摧莽。這一點(diǎn)是它與堆棧變量和堆變量的區(qū)別;
2.變量用static告知編譯器顿痪,自己僅僅在變量的作用范圍內(nèi)可見(jiàn)镊辕。這一點(diǎn)是它與全局變量的區(qū)別。
C++:
1员魏、靜態(tài)成員為所有類對(duì)象所共享丑蛤,不屬于某個(gè)具體的實(shí)例;
2撕阎、類靜態(tài)成員即可用類名::靜態(tài)成員或者對(duì)象.靜態(tài)成員來(lái)訪問(wèn)受裹;
3、類靜態(tài)成員變量必須在類外定義,定義時(shí)不添加static關(guān)鍵字棉饶;
4厦章、類的靜態(tài)成員函數(shù)沒(méi)有默認(rèn)的this指針,因此在它里面不能使用任何非靜態(tài)成員照藻。
5袜啃、靜態(tài)成員和類的普通成員一樣,也有public幸缕、protected群发、private3種訪問(wèn)級(jí)別,也可以具有返回值发乔,const修飾符等參數(shù)熟妓。
注意:
A.若全局變量?jī)H在單個(gè)文件中訪問(wèn),則可以將這個(gè)變量修改為靜態(tài)全局變量栏尚,以降低模塊間的耦合度起愈;
B.若全局變量?jī)H由單個(gè)函數(shù)訪問(wèn),則可以將這個(gè)變量改為該函數(shù)的靜態(tài)局部變量译仗,以降低模塊間的耦合度抬虽;
C.設(shè)計(jì)和使用訪問(wèn)動(dòng)態(tài)全局變量、靜態(tài)全局變量纵菌、靜態(tài)局部變量的函數(shù)時(shí)阐污,需要考慮重入問(wèn)題;
D.如果我們需要一個(gè)可重入的函數(shù)产艾,那么疤剑,我們一定要避免函數(shù)中使用static變量(這樣的函數(shù)被稱為:帶“內(nèi)部存儲(chǔ)器”功能的的函數(shù))
E.函數(shù)中必須要使用static變量情況:比如當(dāng)某函數(shù)的返回值為指針類型時(shí),則必須是static的局部變量的地址作為返回值闷堡,若為auto類型隘膘,則返回為錯(cuò)指針。
C++靜態(tài)成員函數(shù)問(wèn)題:
1.靜態(tài)成員函數(shù)可以調(diào)用非靜態(tài)成員函數(shù)嗎杠览?
不能弯菊;靜態(tài)成員函數(shù)沒(méi)有this指針,是所有類對(duì)象公有的踱阿。成員函數(shù)有this指針管钳,每個(gè)對(duì)象都有自己獨(dú)立的一份。在調(diào)用成員函數(shù)時(shí)软舌,實(shí)際上是this->成員函數(shù)才漆。一個(gè)類的靜態(tài)成員中去訪問(wèn)其非靜態(tài)成員之所以會(huì)出錯(cuò)是因?yàn)樵陬惖姆庆o態(tài)成員不存在的時(shí)候類的靜態(tài)成員就已經(jīng)存在了,訪問(wèn)一個(gè)內(nèi)存中不存在的東西當(dāng)然會(huì)出錯(cuò)佛点。
2.非靜態(tài)成員函數(shù)可以調(diào)用類的靜態(tài)成員函數(shù)嗎醇滥?
可以黎比;非靜態(tài)成員(變量和方法)屬于類的對(duì)象,所以只有在類的對(duì)象產(chǎn)生(創(chuàng)建類的實(shí)例)時(shí)才會(huì)分配內(nèi)存鸳玩,然后通過(guò)類的對(duì)象(實(shí)例)去訪問(wèn)阅虫。
3. extern
在C語(yǔ)言,用extern修飾符修飾的變量或者函數(shù)不跟,表示“此變量或者函數(shù)在其它文件已經(jīng)定義颓帝,在這里只做引用處理”。
// file.cpp
int num = 100;
// file2.cpp
#include <iostream>
using namespace std;
extern int num;
int main()
{
cout << "num = " << num << endl;
return 0;
}
編譯時(shí)窝革,將file.cpp 和 file2.cpp一起編譯购城,其運(yùn)行如下:
g++ file.cpp file2.cpp -o file //編譯
./file // 運(yùn)行執(zhí)行文件
num = 100
注意:
extern聲明的位置對(duì)其作用域也有關(guān)系,如果是在main函數(shù)中進(jìn)行聲明的虐译,則只能在main函數(shù)中調(diào)用工猜,在其它函數(shù)中不能調(diào)用。
// file3.cpp
#include <iostream>
using namespace std;
int sum_num()
{
int sum = 0, b = 2;
sum = num + b;
}
編譯時(shí)菱蔬,其運(yùn)行如下:
g++ file.cpp file2.cpp file3.cpp -o file //編譯
// 出現(xiàn)錯(cuò)誤提示,編譯不過(guò)去
// 在file3.cpp中num為定義