??個(gè)人主頁??
?個(gè)人專欄——C++學(xué)習(xí)?
??點(diǎn)擊關(guān)注??一起學(xué)習(xí)C語言????
目錄
1. const修飾成員函數(shù)
1.1 語法格式
1.2 權(quán)限放大縮小
1.3 思考
1.4 解答
2. 再談構(gòu)造函數(shù)
2.1 構(gòu)造函數(shù)體賦值
2.2 初始化列表
2.3 explicit關(guān)鍵字
3. static成員
3.1 靜態(tài)變量
3.2 靜態(tài)函數(shù)
3.3?靜態(tài)成員變量
1. const修飾成員函數(shù)
將const修飾的“成員函數(shù)”稱之為const成員函數(shù),const修飾類成員函數(shù),實(shí)際修飾該成員函數(shù)隱含的this指針,表明在該成員函數(shù)中不能對(duì)類的任何成員進(jìn)行修改。
1.1 語法格式
在成員函數(shù)的聲明中使用const關(guān)鍵字的語法格式為:
返回類型 函數(shù)名() const;
在成員函數(shù)的定義中使用const關(guān)鍵字的語法格式為:
返回類型 類名::函數(shù)名() const {
? ? // 函數(shù)體
}
1.2 權(quán)限放大縮小
const 修飾的權(quán)限放大(擴(kuò)大)或縮?。s小)取決于成員函數(shù)和成員變量的修飾符。
-
成員函數(shù):
- 如果一個(gè)非const成員函數(shù)被const修飾符修飾,它的權(quán)限會(huì)縮小,即它不能修改對(duì)象的非mutable成員變量,也不能調(diào)用非const成員函數(shù)。
- 如果一個(gè)const成員函數(shù)被const修飾符修飾,它的權(quán)限保持不變,即它不能修改對(duì)象的任何成員變量,也不能調(diào)用非const成員函數(shù)。
-
成員變量:
- 如果一個(gè)非const成員變量被const修飾符修飾,它的權(quán)限會(huì)縮小,即它只能被const成員函數(shù)訪問,而非const成員函數(shù)不能修改它。
- 如果一個(gè)const成員變量被const修飾符修飾,它的權(quán)限保持不變,即它不能修改對(duì)象的任何成員變量,也不能調(diào)用非const成員函數(shù)。
class Example {
private:
int data;
const int constData;
mutable int mutableData;
public:
void nonConstFunc() {
data = 10; // 可以修改非const成員變量
constData = 20; // 錯(cuò)誤!不能修改const成員變量
mutableData = 30; // 可以修改mutable成員變量
constFunc(); // 可以調(diào)用const成員函數(shù)
nonConstMemberFunc(); // 可以調(diào)用非const成員函數(shù)
}
void constFunc() const {
data = 10; // 錯(cuò)誤!不能修改非mutable成員變量
constData = 20; // 錯(cuò)誤!不能修改const成員變量
mutableData = 30; // 可以修改mutable成員變量
nonConstMemberFunc(); // 錯(cuò)誤!不能調(diào)用非const成員函數(shù)
}
void nonConstMemberFunc() {
// 省略函數(shù)體
}
};
1.3 思考
1. const對(duì)象可以調(diào)用非const成員函數(shù)嗎?
2. 非const對(duì)象可以調(diào)用const成員函數(shù)嗎?
3. const成員函數(shù)內(nèi)可以調(diào)用其它的非const成員函數(shù)嗎?
4. 非const成員函數(shù)內(nèi)可以調(diào)用其它的const成員函數(shù)嗎?
1.4 解答
1.?const對(duì)象不能調(diào)用非const成員函數(shù)。
const對(duì)象被視為只讀對(duì)象,它的成員函數(shù)不能修改對(duì)象的狀態(tài)。
因此,只有被聲明為常成員函數(shù)的成員函數(shù)才能在const對(duì)象上調(diào)用。
#include <iostream>
using namespace std;
class Example
{
public:
void nonConstFunc()
{
cout << "Non-const member function." << endl;
}
void constFunc() const
{
cout << "Const member function." << endl;
}
};
int main()
{
const Example obj;
obj.constFunc(); // 可以調(diào)用const成員函數(shù)
obj.nonConstFunc(); // 錯(cuò)誤!不能調(diào)用非const成員函數(shù)
return 0;
}
注釋掉 “ obj.nonConstFunc(); ” 之后:
2.?非const對(duì)象可以調(diào)用const成員函數(shù)。
const成員函數(shù)是一種特殊的成員函數(shù),它承諾不修改對(duì)象的狀態(tài)。
因此,無論是非const對(duì)象還是const對(duì)象,都可以調(diào)用const成員函數(shù)。
#include <iostream>
using namespace std;
class Example {
public:
void nonConstFunc()
{
cout << "Non-const member function." << endl;
}
void constFunc() const
{
cout << "Const member function." << endl;
}
};
int main()
{
Example obj;
obj.constFunc(); // 可以調(diào)用const成員函數(shù)
obj.nonConstFunc(); // 可以調(diào)用非const成員函數(shù)
return 0;
}
?3.?const成員函數(shù)內(nèi)不可以調(diào)用其他非const成員函數(shù)。
const成員函數(shù)調(diào)用非const成員函數(shù),調(diào)用該const成員函數(shù)的對(duì)象已經(jīng)被設(shè)置為const類型,只可以訪問不能修改,在用該const成員函數(shù)訪問其他非const成員函數(shù)可能會(huì)修改,因此const成員函數(shù)不能調(diào)用非const成員函數(shù)。
#include <iostream>
using namespace std;
class Example
{
public:
void nonConstFunc()
{
cout << "Non-const member function." << endl;
}
void constFunc() const
{
cout << "Const member function." << endl;
nonConstFunc(); // 可以調(diào)用非const成員函數(shù)
}
};
int main() {
Example obj;
obj.constFunc();
return 0;
}
4.??非const成員函數(shù)內(nèi)可以調(diào)用其他的const成員函數(shù)。
非const成員函數(shù)可以修改對(duì)象的狀態(tài),因此它在內(nèi)部調(diào)用const成員函數(shù)時(shí)可以保證對(duì)象的狀態(tài)不被修改。
#include <iostream>
using namespace std;
class Example {
private:
int data;
public:
Example(int val) : data(val)
{}
void nonConstFunc() {
cout << "Non-const member function." << endl;
constFunc(); // 可以調(diào)用const成員函數(shù)
}
void constFunc() const {
cout << "Const member function." << endl;
cout << "Data: " << data << endl;
}
};
int main()
{
Example obj(10);
obj.nonConstFunc();
return 0;
}
2. 再談構(gòu)造函數(shù)
2.1 構(gòu)造函數(shù)體賦值
在創(chuàng)建對(duì)象時(shí),編譯器通過調(diào)用構(gòu)造函數(shù),給對(duì)象中各個(gè)成員變量一個(gè)合適的初始值。
class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
雖然上述構(gòu)造函數(shù)調(diào)用之后,對(duì)象中已經(jīng)有了一個(gè)初始值,但是不能將其稱為對(duì)對(duì)象中成員變量 的初始化,構(gòu)造函數(shù)體中的語句只能將其稱為賦初值,而不能稱作初始化。因?yàn)槌跏蓟荒艹跏?化一次,而構(gòu)造函數(shù)體內(nèi)可以多次賦值。
2.2 初始化列表
初始化列表:以一個(gè)冒號(hào)開始,接著是一個(gè)以逗號(hào)分隔的數(shù)據(jù)成員列表,每個(gè)"成員變量"后面跟 一個(gè)放在括號(hào)中的初始值或表達(dá)式。
class Date
{
public:
Date(int year, int month, int day)
: _year(year)
, _month(month)
, _day(day)
{}
private:
int _year;
int _month;
int _day;
};
【注意】
1. 每個(gè)成員變量在初始化列表中只能出現(xiàn)一次(初始化只能初始化一次)
2. 類中包含以下成員,必須放在初始化列表位置進(jìn)行初始化:
- 引用成員變量
- const成員變量
- 自定義類型成員(且該類沒有默認(rèn)構(gòu)造函數(shù)時(shí))
3. 盡量使用初始化列表初始化,因?yàn)椴还苣闶欠袷褂贸跏蓟斜?,?duì)于自定義類型成員變量, 一定會(huì)先使用初始化列表初始化。
4.?成員變量在類中聲明次序就是其在初始化列表中的初始化順序,與其在初始化列表中的先后 次序無關(guān)
class A
{
public:
//A(int a = 0, int b = 1)
A(int a, int b)
:_a(a)
{
cout << "A(int a = 0)" << endl;
}
private:
int _a;
};
class Date
{
public:
// 初始化列表是每個(gè)成員變量定義初始化的位置
// 能用初始化列表就建議用初始化列表
Date(int year, int month, int day, int& x)
:_year(year)
,_month(month)
,_day(day)
,_n(1)
,_ref(x)
,_aa(1, 2)
,_p((int*)malloc(sizeof(4) * 10))
{
if (_p == nullptr)
{
perror("malloc fail");
}
for (size_t i = 0; i < 10; i++)
{
_p[i] = 0;
}
}
private:
// 聲明
int _year;
int _month;
int _day;
// 必須走初始化
const int _n;
int& _ref;
A _aa;
int* _p;
};
int main()
{
// 對(duì)象實(shí)例化
int x = 10;
Date d1(2024, 1, 31, x);
//A aa(2, 3);
return 0;
}
2.3 explicit關(guān)鍵字
explicit是一個(gè)關(guān)鍵字,用于聲明構(gòu)造函數(shù)為顯示構(gòu)造函數(shù)。
當(dāng)一個(gè)構(gòu)造函數(shù)被聲明為explicit時(shí),它不能被用于隱式轉(zhuǎn)換,只能被用于顯式地創(chuàng)建對(duì)象。這個(gè)關(guān)鍵字通常用于防止意外的隱式類型轉(zhuǎn)換。
class MyInt
{
public:
explicit MyInt(int i)
: value(i)
{}
int getValue() const
{
return value;
}
private:
int value;
};
void foo(MyInt mi)
{
int i = mi.getValue();
// ...
}
int main() {
MyInt mi1 = 42; // 錯(cuò)誤,不能進(jìn)行隱式轉(zhuǎn)換
MyInt mi2(42); // 正確,可以顯式創(chuàng)建對(duì)象
foo(42); // 錯(cuò)誤,不能進(jìn)行隱式轉(zhuǎn)換
foo(MyInt(42)); // 正確,可以顯式創(chuàng)建對(duì)象
return 0;
}
3. static成員
static是用于修飾變量、函數(shù)和類成員的關(guān)鍵字。它可以有不同的作用,具體取決于它應(yīng)用的位置。
3.1 靜態(tài)變量
在函數(shù)內(nèi)部使用static修飾的變量稱為靜態(tài)變量,它的生命周期是整個(gè)程序運(yùn)行期間,而不是僅在函數(shù)調(diào)用時(shí)存在。
靜態(tài)變量在內(nèi)存中只有一個(gè)副本,且在第一次初始化時(shí)賦值,并且在程序結(jié)束時(shí)銷毀。靜態(tài)變量默認(rèn)為0,除非顯式初始化。
void foo()
{
static int count = 0; // 靜態(tài)變量
count++;
cout << "Count: " << count << endl;
}
int main() {
foo(); // 輸出 Count: 1
foo(); // 輸出 Count: 2
foo(); // 輸出 Count: 3
return 0;
}
3.2 靜態(tài)函數(shù)
在類內(nèi)部使用static修飾的函數(shù)稱為靜態(tài)函數(shù),它與類的實(shí)例無關(guān),可以直接通過類名調(diào)用,而不需要?jiǎng)?chuàng)建對(duì)象。
靜態(tài)函數(shù)只能訪問類的靜態(tài)成員變量和其他靜態(tài)函數(shù),不能訪問非靜態(tài)成員變量和非靜態(tài)函數(shù)。
class MyClass
{
public:
static void myStaticFunc()
{
cout << "Static function!" << endl;
}
};
int main()
{
MyClass::myStaticFunc(); // 直接調(diào)用靜態(tài)函數(shù)
return 0;
}
靜態(tài)函數(shù)的特點(diǎn):
- 靜態(tài)函數(shù)屬于類本身,而不是類的實(shí)例。
- 靜態(tài)函數(shù)可以直接通過類名調(diào)用,不需要通過對(duì)象來調(diào)用。
- 靜態(tài)函數(shù)無法訪問非靜態(tài)成員變量和非靜態(tài)成員函數(shù),因?yàn)樗鼈兪桥c對(duì)象相關(guān)的。
- 靜態(tài)函數(shù)可以訪問靜態(tài)成員變量和靜態(tài)成員函數(shù)。
- 靜態(tài)函數(shù)在類的范圍內(nèi)具有全局可見性,可以在其他源文件中使用類名來調(diào)用靜態(tài)函數(shù)。
?
3.3?靜態(tài)成員變量
在類內(nèi)部使用static修飾的成員變量稱為靜態(tài)成員變量,它是類的所有實(shí)例共享的,不屬于任何特定對(duì)象。
靜態(tài)成員變量在類內(nèi)部聲明,并在類外部進(jìn)行定義和初始化。定義時(shí)需要指定數(shù)據(jù)類型,并且通常需要提供一個(gè)初始值。
聲明靜態(tài)成員變量:
class MyClass {
public:
static int myStaticVar; // 靜態(tài)成員變量的聲明
};
定義和初始化靜態(tài)成員變量(在類外部):
int MyClass::myStaticVar = 0; // 靜態(tài)成員變量的定義和初始化
靜態(tài)成員變量可以像普通成員變量一樣訪問,可以通過類名和作用域運(yùn)算符::
,或者通過對(duì)象名和點(diǎn)操作符.
來訪問。文章來源:http://www.zghlxwxcb.cn/news/detail-825967.html
MyClass::myStaticVar = 5; // 通過類名訪問靜態(tài)成員變量
MyClass obj;
obj.myStaticVar = 10; // 通過對(duì)象名訪問靜態(tài)成員變量
靜態(tài)成員變量的特點(diǎn):文章來源地址http://www.zghlxwxcb.cn/news/detail-825967.html
- 所有的類對(duì)象共享同一個(gè)靜態(tài)成員變量。
- 靜態(tài)成員變量在程序開始時(shí)初始化,并在程序結(jié)束時(shí)銷毀。
- 靜態(tài)成員變量可以被所有對(duì)象訪問,但只有一個(gè)副本。
- 靜態(tài)成員變量可以被類的所有成員函數(shù)訪問,包括靜態(tài)成員函數(shù)和非靜態(tài)成員函數(shù)。
到了這里,關(guān)于【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!