最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你深入了解C++中的類型轉(zhuǎn)換

 更新時(shí)間:2022年12月27日 10:37:33   作者:~小火苗  
在C語(yǔ)言中,如果賦值運(yùn)算符左右兩側(cè)類型不同,或者形參與實(shí)參類型不匹配,或者返回值類型與接收返回值類型不一致時(shí),就需要發(fā)生類型轉(zhuǎn)化。本文主要介紹了C++中常見(jiàn)的四個(gè)類型轉(zhuǎn)換,需要的可以參考一下

C語(yǔ)言中的類型轉(zhuǎn)換

在C語(yǔ)言中,如果賦值運(yùn)算符左右兩側(cè)類型不同,或者形參與實(shí)參類型不匹配,或者返回值類型與接收返回值類型不一致時(shí),就需要發(fā)生類型轉(zhuǎn)化,C語(yǔ)言中總共有兩種形式的類型轉(zhuǎn)換:隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換。

1.隱式類型轉(zhuǎn)化:編譯器在編譯階段自動(dòng)進(jìn)行,能轉(zhuǎn)就轉(zhuǎn),不能轉(zhuǎn)就編譯失敗

2.顯式類型轉(zhuǎn)化:需要用戶自己處理

3.缺陷:轉(zhuǎn)換的可視性比較差,所有的轉(zhuǎn)換形式都是以一種相同形式書(shū)寫(xiě),難以跟蹤錯(cuò)誤的轉(zhuǎn)換

int main()
{
	int i = 1;
	// 隱式類型轉(zhuǎn)換(意義相近的類型)
	double d = i;
	printf("%d, %.2f\n", i, d);

	int* p = &i;
	// 顯示的強(qiáng)制類型轉(zhuǎn)換(意義不相近的類型,值轉(zhuǎn)換后有意義)
	int address = (int)p;

	printf("%x, %d\n", p, address);

	return 0;
}

為什么C++需要四種類型轉(zhuǎn)換

C風(fēng)格的轉(zhuǎn)換格式很簡(jiǎn)單,但是有不少缺點(diǎn)的:

1.隱式類型轉(zhuǎn)化有些情況下可能會(huì)出問(wèn)題:比如數(shù)據(jù)精度丟失

2.顯式類型轉(zhuǎn)換將所有情況混合在一起,代碼不夠清晰

因此C++提出了自己的類型轉(zhuǎn)化風(fēng)格,注意因?yàn)镃++要兼容C語(yǔ)言,所以C++中還可以使用C語(yǔ)言的轉(zhuǎn)化風(fēng)格。

C++強(qiáng)制類型轉(zhuǎn)換

標(biāo)準(zhǔn)C++為了加強(qiáng)類型轉(zhuǎn)換的可視性,引入了四種命名的強(qiáng)制類型轉(zhuǎn)換操作符:

static_cast、 reinterpret_cast、 const_cast、 dynamic_cast

static_cast

static_cast用于非多態(tài)類型的轉(zhuǎn)換(靜態(tài)轉(zhuǎn)換),編譯器隱式執(zhí)行的任何類型轉(zhuǎn)換都可用static_cast,但它不能用于兩個(gè)不相關(guān)的類型進(jìn)行轉(zhuǎn)換

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d); // 意義相近的
	cout << a << endl;

	int* p = &a;
	// 不支持的
	//int address = static_cast<int>(p); // 意義不相近
	return 0;
}

reinterpret_cast

reinterpret_cast操作符通常為操作數(shù)的位模式提供較低層次的重新解釋,用于將一種類型轉(zhuǎn)換為另一種不同的類型

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d); // 意義相近
	cout << a << endl;

	int* p = &a;
	// 不支持的
	//int address = static_cast<int>(p);
	int address = reinterpret_cast<int>(p); // 意義不相近
	return 0;
}

const_cast

const_cast最常用的用途就是刪除變量的const屬性,方便賦值

int main()
{
	// const int a = 2;
	volatile const int a = 2;
	int* p = const_cast<int*>(&a);
	//int* p = (int*)&a;

	*p = 3;

	cout << a << endl;  // 2
	cout << *p << endl; // 3


	return 0;
}

dynamic_cast

class A
{
public:
	virtual void f(){}
public:
	int _a = 0;
};

class B : public A
{
public:
	int _b = 1;
};

// A*指針pa有可能指向父類,有可能指向子類
void fun(A* pa)
{
	// 如果pa是指向子類,那么可以轉(zhuǎn)換,轉(zhuǎn)換表達(dá)式返回正確的地址
	// 如果pa是指向父類,那么不能轉(zhuǎn)換,轉(zhuǎn)換表達(dá)式返回nullptr
	B* pb = dynamic_cast<B*>(pa); // 安全的
	//B* pb = (B*)pa;             // 不安全
	if (pb)
	{
		cout << "轉(zhuǎn)換成功" << endl;
		pb->_a++;
		pb->_b++;
		cout << pb->_a << ":" << pb->_b << endl;
	}
	else
	{
		cout << "轉(zhuǎn)換失敗" << endl;
		pa->_a++;
		cout << pa->_a << endl;
	}
}
// A 是父類   B是子類
int main()
{
	// 父類對(duì)象無(wú)論如何都是不允許轉(zhuǎn)換成子類對(duì)象的
	// A aa;
	// B bb = dynamic_cast<B>(aa); // 不支持
	// B bb = (B)aa;               // 不支持

	A aa;
	B bb;
	A* pa = &bb;

	B* pb = dynamic_cast<B*>(pa);

	//fun(nullptr);
	return 0;
}

class A1
{
public:
	virtual void f(){}
public:
	int _a1 = 0;
};

class A2
{
public:
	virtual void f(){}
public:
	int _a2 = 0;
};

class B : public A1, public A2
{
public:
	int _b = 1;
};

int main()
{
	B bb;
	A1* ptr1 = &bb;
	A2* ptr2 = &bb;
	cout << ptr1 << endl;
	cout << ptr2 << endl << endl;

	
	B* pb1 = (B*)ptr1;
	B* pb2 = (B*)ptr2;
	cout << pb1 << endl;
	cout << pb2 << endl << endl;

	B* pb3 = dynamic_cast<B*>(ptr1);
	B* pb4 = dynamic_cast<B*>(ptr2);
	cout << pb3 << endl;
	cout << pb4 << endl << endl;

	return 0;
}

到此這篇關(guān)于一文帶你深入了解C++中的類型轉(zhuǎn)換的文章就介紹到這了,更多相關(guān)C++類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄

    C語(yǔ)言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言使用結(jié)構(gòu)體實(shí)現(xiàn)簡(jiǎn)單通訊錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 用C語(yǔ)言實(shí)現(xiàn)排雷游戲

    用C語(yǔ)言實(shí)現(xiàn)排雷游戲

    大家好,本篇文章主要講的是用C語(yǔ)言實(shí)現(xiàn)排雷游戲,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語(yǔ)言示例講解結(jié)構(gòu)體的聲明與初始化方法

    C語(yǔ)言示例講解結(jié)構(gòu)體的聲明與初始化方法

    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類型的變量。本文將通過(guò)示例為大家詳細(xì)講講C語(yǔ)言中結(jié)構(gòu)體的使用,需要的可以參考一下
    2022-07-07
  • VisualStudio2022不支持.NET Framework 4.0項(xiàng)目解決辦法

    VisualStudio2022不支持.NET Framework 4.0項(xiàng)目解決辦法

    本文主要介紹了VisualStudio2022不支持.NET Framework 4.0項(xiàng)目解決辦法,文中通過(guò)圖文的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • C語(yǔ)言單鏈表遍歷與求和示例解讀

    C語(yǔ)言單鏈表遍歷與求和示例解讀

    我們?cè)趯W(xué)習(xí)編程的過(guò)程中,雖然有些語(yǔ)法很簡(jiǎn)單,但是我們還是要做多題。不做題是發(fā)現(xiàn)不了問(wèn)題的,發(fā)現(xiàn)問(wèn)題我們就可以“對(duì)癥下藥”,進(jìn)行查漏補(bǔ)缺了。刷題可以先從簡(jiǎn)單題開(kāi)始刷,熟練之后再做一些可以提升自己能力的題
    2022-07-07
  • 詳細(xì)解析命令行的getopt_long()函數(shù)

    詳細(xì)解析命令行的getopt_long()函數(shù)

    getopt_long支持長(zhǎng)選項(xiàng)的命令行解析,函數(shù)中的參數(shù)argc和argv通常直接從main()的兩個(gè)參數(shù)傳遞而來(lái)
    2013-09-09
  • C語(yǔ)言實(shí)現(xiàn)掃雷小游戲詳細(xì)代碼

    C語(yǔ)言實(shí)現(xiàn)掃雷小游戲詳細(xì)代碼

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷小游戲的代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C/C++ Windows SAPI實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能

    C/C++ Windows SAPI實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能

    本文通過(guò)封裝Windows SAPI(Speech Application Programming Interface),提供了一個(gè)現(xiàn)代化的C++接口實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能,這篇文章重點(diǎn)給大家介紹C/C++ Windows SAPI自實(shí)現(xiàn)文字轉(zhuǎn)語(yǔ)音功能,感興趣的朋友一起看看吧
    2025-02-02
  • 十個(gè)C++惡搞朋友的代碼合集

    十個(gè)C++惡搞朋友的代碼合集

    這篇文章主要為大家整理了十個(gè)C++中可以惡搞朋友的代碼合集(注意!從第五個(gè)開(kāi)始為危險(xiǎn)/永久性程序,請(qǐng)慎重使用),感興趣的小伙伴可以收藏一下
    2023-02-02
  • CRITICAL_SECTION用法案例詳解

    CRITICAL_SECTION用法案例詳解

    這篇文章主要介紹了CRITICAL_SECTION用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論

苗栗县| 咸阳市| 朝阳县| 五家渠市| 定结县| 宝鸡市| 策勒县| 黑山县| 德安县| 通渭县| 宁波市| 东阿县| 怀化市| 榆中县| 太保市| 漠河县| 洛川县| 凤山市| 武穴市| 桑植县| 汨罗市| 凉城县| 洛浦县| 舞钢市| 柘荣县| 陈巴尔虎旗| 淮北市| 大方县| 阿拉善左旗| 会泽县| 临泽县| 周口市| 崇义县| 金沙县| 紫云| 榕江县| 山东省| 镇康县| 沙河市| 胶南市| 新兴县|