C++ 常成員函數
常常把對象的成員函數分為兩類:修改對象狀態的成員函數、獲取對象狀態的成員函數。
常成員函數就是一種獲取對象狀態的成員函數,並且不能改變對象的狀態(也就是不能修改對象的成員的值)。
形式:
class A
{ ...
void f() const {...}
}
或
class A
{...
void f() const;//聲明
}
void A::f() const //定義
{
...
}
當時要注意下面兩個例子:
class A
{
int x;
char *p;
public:
...
void f() const
{
x=10; //Error
p = new char[20]; //Error
}
}
class A
{
int x;
char *p;
public:
...
void f() const
{
strcpy(p,"abc");//沒有改變p的值,因此編譯程序認為OK
*p = 'A';//同上
}
}
————————————————
【C++】 常對象、常數據成員、常成員函數總結
常數據成員
◆ 常數據成員必須進行初始化,並且不能被更新。
◆ 常數據成員不能在聲明時賦初始值(普通數據成員也是),常數據成員必須在構造函數初始化列表進行初始化;普通數據成員在初始化列表和函數體中初始化均可。
◆ PS:類的成員對象若要傳入參數初始化,則必須在構造函數初始化列表進行;(成員對象:當一個類的成員是另一個類的對象時,這個對象就叫成員對象。)
常對象
◆ ⭐常對象可以調用常成員函數,不能調用非const成員函數;非const對象,可以調用普通成員函數和常成員函數。
◆ 常對象的成員函數不一定都是常成員函數;同樣的常對象的數據成員不一定都是常數據成員。
◆ 常對象一旦初始化,常對象的數據成員便不允許修改,而不是說常對象的數據成員都是常數據成員。
◆ PS:定義常對象有兩種方法,1. Point const a; 2. const Point a;(同樣的,定義變量或指針時,const放前放後意義一樣,如:1. const double a; double const a; 2. const int *p; int const *p; 但是定義指針常量時,只能用 int * const p;)
常成員函數
◆ 常成員函數不更新對象的數據成員。
◆ 常成員函數的const關鍵字可以被用於參與對重載函數的區分。
◆ ⭐通常非const成員函數需要定義一個const版本的重載函數,以方便定義常對象後調用常成員函數。
◈ 如果常對象調用的常成員函數返回的是指向當前對象的指針(或返回的是當前對象),那麼此常成員函數的聲明的返回類型要加const,例如:
◊ 成員函數返回指向當前對象的指針
const *Point fun1(); //非const成員函數的類內聲明;
const *Point fun1() const; //習慣上要再聲明一個常成員函數作重載函數,注意到此函數聲明有兩個const;
◊ 成員函數返回指向當前對象
const Point fun1(); //非const成員函數的類內聲明;
const Point fun1() const; //習慣上要再聲明一個常成員函數作重載函數,注意到此函數聲明有兩個const;
◊ ⭐注意,如果一個類中聲明以下4個重載函數:
① Point fun1();
② const Point fun1();
③ Point fun1() const;
④ const Point fun1() const;
【解析】①和②是衝突的,因為無法區分僅按返回類型區分的重載函數;③和④是衝突的,也是因為無法區分僅按返回類型區分的重載函數。
所以正確的重載函數搭配有3種:
◊ ①和③搭配:
Point fun1(); //函數返回非const對象
Point fun1() const; //函數返回非const對象
[解析]適用於定義常對象後調用常成員函數,常成員函數返回類型是非const的Point類對象。
◊ ①和④搭配(這裡把返回類型改為指針,因為常用):
Point *fun1() {return this; }; //函數返回指向本對象的指針
const Point *fun1() const { return this; };//函數返回指向本常對象的指針,第一個const說明返回的是指向常對象的指針,第二個const說明此函數是常函數
[解析]適用於定義常對象後調用常成員函數,常成員函數返回類型是常Point類對象(如return *this;)。
◊ ②和④搭配:
const Point fun1(); //函數返回常對象
const Point fun1() const; //函數返回常對象
[解析]適用於定義常對象後調用常成員函數,常成員函數返回類型是常Point類對象。
◊ ②和③搭配:
const Point fun1();
Point fun1() const;
[解析]雖然搭配合法,但是似乎不存在這種搭配。
————————————————
通過分享實用的計算機編程語言乾貨,推動中國編程到2025年基本實現普及化,使編程變得全民皆知,最終實現中國編程之崛起,這裡是中國編程2025,感謝大家的支持。
原文鏈接:https://blog.csdn.net/haitaolang/article/details/70162903
閱讀更多 中國編程2025 的文章