国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化

這篇具有很好參考價(jià)值的文章主要介紹了【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

??個(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ù)和成員變量的修飾符。

  1. 成員函數(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ù)。
  2. 成員變量:

    • 如果一個(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;
}

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化,C++學(xué)習(xí),算法,c++

注釋掉 “ obj.nonConstFunc(); ” 之后:

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化,C++學(xué)習(xí),算法,c++

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;
}

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化,C++學(xué)習(xí),算法,c++

?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;
}

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化,C++學(xué)習(xí),算法,c++

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;
}

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化,C++學(xué)習(xí),算法,c++

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;
}

【C++】const、static關(guān)鍵字和構(gòu)造函數(shù)初始化,C++學(xué)習(xí),算法,c++

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):

  1. 靜態(tài)函數(shù)屬于類本身,而不是類的實(shí)例。
  2. 靜態(tài)函數(shù)可以直接通過類名調(diào)用,不需要通過對(duì)象來調(diào)用。
  3. 靜態(tài)函數(shù)無法訪問非靜態(tài)成員變量和非靜態(tài)成員函數(shù),因?yàn)樗鼈兪桥c對(duì)象相關(guān)的。
  4. 靜態(tài)函數(shù)可以訪問靜態(tài)成員變量和靜態(tài)成員函數(shù)。
  5. 靜態(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)操作符.來訪問。

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

  1. 所有的類對(duì)象共享同一個(gè)靜態(tài)成員變量。
  2. 靜態(tài)成員變量在程序開始時(shí)初始化,并在程序結(jié)束時(shí)銷毀。
  3. 靜態(tài)成員變量可以被所有對(duì)象訪問,但只有一個(gè)副本。
  4. 靜態(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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++——初始化列表 | explicit關(guān)鍵字 | static成員

    C++——初始化列表 | explicit關(guān)鍵字 | static成員

    ??作者簡(jiǎn)介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學(xué)習(xí)。 ?? 本文收錄于 C++系列 ,本專欄主要內(nèi)容為 C++ 初階、C++ 進(jìn)階、STL 詳解等,專為大學(xué)生打造全套 C++ 學(xué)習(xí)教程,持續(xù)更新! ?? 相關(guān)專欄推薦: C語言初階系列 、 C語言進(jìn)階系列 、 數(shù)據(jù)結(jié)構(gòu)與算法 本章我們

    2023年04月11日
    瀏覽(22)
  • C++面試八股文:static和const的關(guān)鍵字有哪些用法?

    某日二師兄參加XXX科技公司的C++工程師開發(fā)崗位第7面: 面試官:C++中, static 和 const 的有哪些用法? 二師兄: satic 主要用在以下三個(gè)方面:1.用在全局作用域,修飾的變量或者函數(shù)為靜態(tài)的,限制在本文件內(nèi)使用。2.方法內(nèi)修飾修飾靜態(tài)局部變量,在第一次訪問

    2024年02月08日
    瀏覽(22)
  • 詳解const、static關(guān)鍵字

    詳解const、static關(guān)鍵字

    目錄 ? 一、static 二、const 在c語言中: static是用來修飾變量和函數(shù)的 ? ? ? ? 1.修飾局部變量——稱為靜態(tài)局部變量 ? ? ? ? 2.修飾全局變量——稱為靜態(tài)全局變量 ? ? ? ? 3.修飾函數(shù)——稱為靜態(tài)函數(shù) 有關(guān)內(nèi)存相關(guān)知識(shí)補(bǔ)充: 程序的所有數(shù)據(jù),也就是所有的

    2024年02月06日
    瀏覽(24)
  • 嵌入式C語言關(guān)鍵字(const、static、volitatile)

    C語言中const修飾通常是用來聲明常量,并聲明常量的值不能修改。當(dāng)涉及 指針變量 時(shí)情況就會(huì)變得更加有趣,需要特別注意。因?yàn)橛袃蓸訓(xùn)|西都有可能成為常量— 一種是用來限定指向的空間的值不可修改;另一種是限定指針不可修改 。下面是幾個(gè)聲明的例子: 總結(jié):cons

    2024年02月06日
    瀏覽(26)
  • static,const,volatile,extern,register關(guān)鍵字深入解析

    static,const,volatile,extern,register關(guān)鍵字深入解析

    ?作者簡(jiǎn)介:嵌入式入坑者,與大家一起加油,希望文章能夠幫助各位?。。?! ??個(gè)人主頁:@rivencode的個(gè)人主頁 ??系列專欄:玩轉(zhuǎn)C語言 ??保持學(xué)習(xí)、保持熱愛、認(rèn)真分享、一起進(jìn)步??! 我們都知道一個(gè)源文件要生成我們計(jì)算機(jī)課執(zhí)行的文件要經(jīng)過: 源文件(test.c)—預(yù)編

    2023年04月08日
    瀏覽(21)
  • C語言中volatile/register/const/static/extern/auto關(guān)鍵字的作用

    目錄 一、volatile 二、register詳解 三、const詳解 四、static詳解 五、extern詳解 語法 作用 六、auto詳解 突然想總結(jié)一下這些的作用,靈活使用這些對(duì)程序的可靠性和速率都有提高 volatile是防止編譯器優(yōu)化,如果是高頻繁的變量編譯器會(huì)自動(dòng)將變量放到寄存器中,但是有的變

    2024年02月07日
    瀏覽(25)
  • c++關(guān)鍵字const

    C++中的const是一種常量修飾符。在變量、函數(shù)參數(shù)和成員函數(shù)中使用const可以限制其對(duì)數(shù)據(jù)的修改。 const修飾的數(shù)據(jù)在定義時(shí)必須進(jìn)行初始化,且不能被修改,因此使用const可以提高代碼的安全性和可讀性。 在 C ++ 中, const修飾的成員函數(shù)表示該函數(shù)保證不會(huì)修改類的成員變量

    2024年01月19日
    瀏覽(30)
  • C++系列:const關(guān)鍵字

    在學(xué)習(xí)C++時(shí),const的知識(shí)點(diǎn)分散在書的各個(gè)章節(jié)。當(dāng)我們嘗試在編程時(shí)使用const時(shí),總會(huì)感覺有一些細(xì)節(jié)被遺忘,因而不能得心應(yīng)手地使用const。因此,本篇文章嘗試著對(duì)const的做一些總結(jié)。參考書籍《C++ Primer Plus》 這里是我做的關(guān)于const的一些總結(jié)

    2024年03月09日
    瀏覽(29)
  • 【C++】const關(guān)鍵字的詳解!!

    【C++】const關(guān)鍵字的詳解??!

    ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???? ?? ?? ?? 個(gè)人主頁 :阿然成長(zhǎng)日記 ??點(diǎn)擊可跳轉(zhuǎn) ?? 個(gè)人專欄: ??數(shù)據(jù)結(jié)構(gòu)與算法??C語言進(jìn)階 ?? 不能則學(xué),不知?jiǎng)t問,恥于問人,決無長(zhǎng)進(jìn) ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? const是永恒不

    2024年02月03日
    瀏覽(30)
  • C++—static關(guān)鍵字詳解

    C++的static有兩種用法:面向過程程序設(shè)計(jì)中的static和面向?qū)ο蟪绦蛟O(shè)計(jì)中的static。前者應(yīng)用于普通變量和函數(shù),不涉及類;后者主要說明static在類中的作用。 靜態(tài)全局變量有以下特點(diǎn): 1、該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存; 2、未經(jīng)初始化的靜態(tài)全局變量會(huì)被程序自動(dòng)初始化為

    2024年02月15日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包