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

C++強(qiáng)制類(lèi)型轉(zhuǎn)化、const的全解析

 更新時(shí)間:2026年02月12日 09:24:28   作者:sycmancia  
本文給大家介紹了C++強(qiáng)制類(lèi)型轉(zhuǎn)化、const的理解,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

1.C方式強(qiáng)制類(lèi)型((Type)

(a))轉(zhuǎn)換存在的問(wèn)題

(1)任意類(lèi)型之間都可以進(jìn)行轉(zhuǎn)換,編譯器很難判斷其正確性

(2)在源碼中無(wú)法快速定位所有使用強(qiáng)制類(lèi)型轉(zhuǎn)換的語(yǔ)句

C++中的強(qiáng)制類(lèi)型轉(zhuǎn)換,語(yǔ)法:xxx_cast<Type>(a)

(1)static_cast

用于基本類(lèi)型間的轉(zhuǎn)換,不能用于基本類(lèi)型指針間的轉(zhuǎn)換,用于有繼承關(guān)系類(lèi)對(duì)象之間的轉(zhuǎn)換和類(lèi)指針之間的轉(zhuǎn)換

(2)const_cast

用于去除變量的只讀屬性,強(qiáng)制轉(zhuǎn)換的目標(biāo)類(lèi)型必須是指針或引用

(3)dynamic_cast

用于有繼承關(guān)系的類(lèi)指針間的轉(zhuǎn)換,用于有交叉關(guān)系的類(lèi)指針間的轉(zhuǎn)換,具有類(lèi)型檢查的功能,需要虛函數(shù)的支持

通過(guò)子類(lèi)指針去指向父類(lèi)指針

#include <iostream>
using namespace std;
class Base
{
public:
    Base()
    {
        cout << "Base::Base()" << endl;
    }
    virtual void func()
    {
        cout << "Base::func()" << endl;
    }
    virtual ~Base()
    {
        cout << "Base::~Base()" << endl;
    }
};
class Derived : public Base
{
public:
    virtual void func()
    {
        cout << "Derived::func()" << endl;
    }
};
int main()
{
    Base* p = new Base;                            //初始化父類(lèi)指針
    Derived* pd = dynamic_cast<Derived*>(p);    //由于父類(lèi)指針指向的是父類(lèi),只有父類(lèi)虛函數(shù)表,沒(méi)有子類(lèi)的虛函數(shù)表,所以轉(zhuǎn)換失敗
                              //如果使用static_cast或者reinterpret_cast,則能成功,調(diào)用pd->func則打印Base::func()    
    //pd->func();                               //由于pd=0,所以這里會(huì)程序崩潰
    cout << "pd = " << pd << endl;              //轉(zhuǎn)換失敗,打印 0
    delete p;
    p = reinterpret_cast<Base*>(new Derived);      //等價(jià)于p =  (Base*)new Derived; 或者 p =  reinterpret_cast<Base*>(new Derived)
                              //或者static_cast
    pd = dynamic_cast<Derived*>(p);              //由于父類(lèi)指針指向的是子類(lèi),所以有子類(lèi)虛函數(shù)表
    pd->func();                                  //打印"Derived::func()"
    cout <<"pd = " << pd <<endl;                //轉(zhuǎn)換成功,打印地址值
    delete p;
    return 0;
}
  • 父類(lèi)(無(wú)虛函數(shù))強(qiáng)制轉(zhuǎn)為子類(lèi)時(shí),可以用static_cast或者reinterpret_cast進(jìn)行強(qiáng)轉(zhuǎn)

(4)reinterpret_cast

用于指針類(lèi)型間的轉(zhuǎn)換,用于整數(shù)與指針類(lèi)型間的強(qiáng)轉(zhuǎn)

#include <stdio.h>
void staic_cast_demo() {
	int i = 0x12345;
	char c = 'c';
	int* pi = &i;
	char* pc = &c;
	c = static_cast<char>(i);
	// pc = static_cast<char*>(pi); //error,不能用于基本類(lèi)型指針間的轉(zhuǎn)換
}
void const_cast_demo() {
	const int& j = 1; //只讀變量
	int& k = const_cast<int&>(j); //去除只讀變量,可以通過(guò)k修改變量的值
	const int x = 2; //常量,存在符號(hào)表里
	int& y = const_cast<int&>(x); //內(nèi)存會(huì)給這個(gè)常量分配一個(gè)臨時(shí)的空間,并且y指向這塊空間
	// int z = const_cast<int>(x); //error,目標(biāo)類(lèi)型必須是指針或引用
	k = 5;
	printf("k=%d\n", k); //5
	printf("j=%d\n", j); //5
	y = 8;
	printf("x=%d\n", x); //2
	printf("y=%d\n", y); //8
	printf("&x=%p\n", &x); //&x=0000006DB754F964
	printf("&y=%p\n", &y); //&y=0000006DB754F964
}
void reinterpret_cast_demo() {
	int i = 0;
	char c = 'c';
	int* pi = &i;
	char* pc = &c;
	pc = reinterpret_cast<char*>(pi);
	pi = reinterpret_cast<int*>(pc);
	pi = reinterpret_cast<int*>(i);
	// c = reinterpret_cast<char>(i); //error,不能用于基本類(lèi)型間的轉(zhuǎn)換
}
void dynamic_cast_demo() {
	int i = 0;
	int* pi = &i;
	// char* pc = dynamic_cast<char*>(pi); error,只能用于有繼承關(guān)系的類(lèi)指針間的轉(zhuǎn)換
}
int main() {
	staic_cast_demo();
	const_cast_demo();
}

2.const什么是只讀變量,什么是常量?

(1)只有用字面量初始化的const常量才會(huì)進(jìn)入符號(hào)表

const int x=1;

(2)使用其他變量初始化的const常量仍然是只讀變量

const int& rx=x;

(3)被volatile修飾的const常量是易變的,因此不會(huì)進(jìn)入符號(hào)表

即在編譯期間不能直接確定初始值的const標(biāo)識(shí)符,都被作為只讀變量處理,只讀變量?jī)H僅意味著被const修飾的變量不能出現(xiàn)在賦值符號(hào)左邊

#include <stdio.h>
int main() {
	const int x = 1;
	const int& rx = x;
	int& nrx = const_cast<int&>(rx);
	nrx = 5;
	printf("x=%d\n", x);
	printf("rx=%d\n", rx);
	printf("nrx=%d\n", nrx);
	printf("&x=%d\n", &x);
	printf("&rx=%d\n", &rx);
	printf("&nrx=%d\n", &nrx);
	volatile const int y = 2; //加了volatile就是只讀變量
	int* p = const_cast<int*>(&y);
	*p = 6;
	printf("y=%d\n", y); //6
	printf("p=%p\n", p); //p=000000D6682FF8D4
	const int z = y;
	p = const_cast<int*>(&z);
	*p = 7;
	printf("z=%d\n", z);
	printf("p=%p\n", p);
	char c = 'c';
	char& rc = c;
	const int& trc = c; //引用的類(lèi)型不同,則會(huì)生成一個(gè)新的只讀變量,即trc是只讀變量
	rc = 'a';
	printf("c=%c\n", c);
	printf("rc=%c\n", rc);
	printf("trc=%c\n", trc);
}

運(yùn)行結(jié)果:

3.引用與指針的關(guān)系

指針:

(1)指針是一個(gè)變量,值為一個(gè)內(nèi)存地址,不需要初始化,可以保存不同的地址

(2)通過(guò)指針可以訪(fǎng)問(wèn)對(duì)應(yīng)內(nèi)存地址中的值

(3)指針可以被const修飾為常量或只讀變量

引用:

(1)引用只是變量的一個(gè)新名字,對(duì)引用的操作都會(huì)傳遞到代表的變量

(2)const引用使其代表的變量具有只讀屬性

(3)引用必須在定義時(shí)初始化,之后無(wú)法代表其他變量

#include <stdio.h>
int main() {
    // const 常量
    const int c = 0;    //const局部變量
    int* p = (int*)&c; //使用&操作符,會(huì)分配空間      int* p = (int*)&c  -> const int& p = c;
    *p = 5;
    printf("c = %d,*p=%d\n", c, *p);  // c = 0,*p=5 實(shí)際沒(méi)有改變c自身的值。
    // const 只讀變量 (一般用在引用或者指針上)
    int d = 1;          // 臨時(shí)變量,自身可讀寫(xiě)
    const int& p2 = d;   // 其實(shí)這個(gè)p2 是個(gè)只讀變量(可以通過(guò)const_cast去更改)
    int& p3 = const_cast<int&>(p2);
    p3 = 100;
    printf("d = %d  p2 = %d\n", d, p2);  //d = 100  p2 = 100  實(shí)際目標(biāo)d被改變了,因?yàn)閐是個(gè)可讀寫(xiě)的變量。
                                         //所以引用修飾的const只是個(gè)標(biāo)志,到底能不能更改目標(biāo),需要引用的目標(biāo)類(lèi)型是否是const
    const int d2 = 1;          // 引用的目標(biāo)類(lèi)型是const
    const int& p4 = d2;   // 其實(shí)這個(gè)p4 是個(gè)只讀變量(可以通過(guò)const_cast去更改)
    int& p5 = const_cast<int&>(p4);
    p5 = 100;
    printf("d2 = %d  p4 = %d\n", d2, p4);  //d = 100  p2 = 100  實(shí)際目標(biāo)d2沒(méi)有改變,因?yàn)閐2是個(gè)常量。 
    return 0;
}

到此這篇關(guān)于C++強(qiáng)制類(lèi)型轉(zhuǎn)化、const的理解的文章就介紹到這了,更多相關(guān)c++強(qiáng)制類(lèi)型轉(zhuǎn)化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲及其優(yōu)化

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲及其優(yōu)化

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲及其優(yōu)化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Windows下Qt讀取系統(tǒng)的內(nèi)存、CPU、GPU等使用信息的示例代碼

    Windows下Qt讀取系統(tǒng)的內(nèi)存、CPU、GPU等使用信息的示例代碼

    在當(dāng)今計(jì)算機(jī)應(yīng)用廣泛的領(lǐng)域中,了解系統(tǒng)的內(nèi)存、CPU和GPU使用情況是非常重要的,本文將介紹如何使用Qt和Windows API來(lái)讀取系統(tǒng)的內(nèi)存、CPU和GPU使用詳細(xì)信息,將提供一個(gè)完整的示例代碼,需要的朋友可以參考下
    2024-01-01
  • C++多線(xiàn)程中互斥量的使用詳解

    C++多線(xiàn)程中互斥量的使用詳解

    這篇文章主要介紹了C++多線(xiàn)程中互斥量的使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • C++簡(jiǎn)單又好用的基本運(yùn)算符重載

    C++簡(jiǎn)單又好用的基本運(yùn)算符重載

    繼友元知識(shí)過(guò)后,就到了今天的C++運(yùn)算符重載的內(nèi)容了,運(yùn)算符重載是C++里比較重要的內(nèi)容。這篇博文不會(huì)一下子講完各種運(yùn)算符重載,因?yàn)樘嗔肆艘膊缓梦照莆?,所以運(yùn)算符重載我準(zhǔn)備分多次記錄和分享,那么接下來(lái)進(jìn)入正文
    2022-06-06
  • Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲

    這篇文章主要為大家詳細(xì)介紹了Linux下C語(yǔ)言實(shí)現(xiàn)貪吃蛇小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 詳解C語(yǔ)言中的getgrgid()函數(shù)和getgrnam()函數(shù)

    詳解C語(yǔ)言中的getgrgid()函數(shù)和getgrnam()函數(shù)

    這篇文章主要介紹了詳解C語(yǔ)言中的getgrgid()函數(shù)和getgrnam()函數(shù),是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-08-08
  • C++?結(jié)合?opencv讀取圖片與視頻的方法

    C++?結(jié)合?opencv讀取圖片與視頻的方法

    這篇文章主要介紹了C++?結(jié)合?opencv讀取圖片與視頻,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • C++編程中的函數(shù)指針初步解析

    C++編程中的函數(shù)指針初步解析

    這篇文章主要介紹了C++編程中的函數(shù)指針初步解析,函數(shù)指針在C語(yǔ)言和C++學(xué)習(xí)中都是非常重要的知識(shí),需要的朋友可以參考下
    2016-04-04
  • 面試常見(jiàn)問(wèn)題之C語(yǔ)言與C++的區(qū)別問(wèn)題

    面試常見(jiàn)問(wèn)題之C語(yǔ)言與C++的區(qū)別問(wèn)題

    在C中,用static修飾的變量或函數(shù),主要用來(lái)說(shuō)明這個(gè)變量或函數(shù)只能在本文件代碼塊中訪(fǎng)問(wèn),而文件外部的代碼無(wú)權(quán)訪(fǎng)問(wèn),今天重點(diǎn)給大家介紹面試中常見(jiàn)的C語(yǔ)言與C++區(qū)別的問(wèn)題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字小游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

郑州市| 商城县| 衡东县| 茶陵县| 济源市| 盈江县| 隆林| 清远市| 苏尼特左旗| 龙游县| 蒙城县| 和龙市| 余干县| 辛集市| 门头沟区| 叙永县| 丹江口市| 叶城县| 南阳市| 邵阳市| 双峰县| 辰溪县| 广河县| 无棣县| 华亭县| 阿城市| 景东| 西吉县| 郯城县| 慈利县| 大冶市| 博湖县| 富平县| 曲沃县| 大同市| 潜江市| 神池县| 伊宁县| 孟村| 昌都县| 迁西县|