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

詳解C++?轉(zhuǎn)換的非正式分類

 更新時(shí)間:2022年01月20日 15:32:06   作者:mkckr0  
C++?正式分類方法是直接按語(yǔ)法分類,分為:隱式轉(zhuǎn)換和顯示轉(zhuǎn)換。這篇文章主要介紹了C++?轉(zhuǎn)換的非正式分類,需要的朋友可以參考下

C++ 正式分類方法是直接按語(yǔ)法分類,分為:隱式轉(zhuǎn)換和顯示轉(zhuǎn)換。隱式轉(zhuǎn)換又稱為標(biāo)準(zhǔn)轉(zhuǎn)換。顯示轉(zhuǎn)換又分為:C 風(fēng)格轉(zhuǎn)換、函數(shù)風(fēng)格轉(zhuǎn)換、C++ 風(fēng)格轉(zhuǎn)換。C++風(fēng)格轉(zhuǎn)換就是 static_cast、dynamic_castconst_castreinterpret_cast 這 4 種。

有很長(zhǎng)一段時(shí)間我都有這樣的疑問(wèn):轉(zhuǎn)換前的對(duì)象和轉(zhuǎn)換后的對(duì)象是不是同一個(gè)?

現(xiàn)在,我引入一種非正式分類方法,分為:同對(duì)象轉(zhuǎn)換和異對(duì)象轉(zhuǎn)換。這兩個(gè)術(shù)語(yǔ)是我自己編的,只是為了方便說(shuō)明問(wèn)題。

  • 同對(duì)象轉(zhuǎn)換:轉(zhuǎn)換后的對(duì)象和轉(zhuǎn)換前的對(duì)象是同一個(gè),也就是不會(huì)構(gòu)造一個(gè)新的對(duì)象,還是使用原來(lái)的對(duì)象。
  • 異對(duì)象轉(zhuǎn)換:轉(zhuǎn)換后的對(duì)象和轉(zhuǎn)換前的對(duì)象不是同一個(gè),也就是會(huì)構(gòu)造一個(gè)新的的對(duì)象。

下面分別說(shuō)明這兩種轉(zhuǎn)換的典型情況。

一、同對(duì)象轉(zhuǎn)換

所有的值類別轉(zhuǎn)換及其變形都是同對(duì)象轉(zhuǎn)換。

1. 值類別轉(zhuǎn)換

C++ 的值類別可以使用 static_cast 進(jìn)行轉(zhuǎn)換,屬于同對(duì)象轉(zhuǎn)換。注意:static_cast<T&>()static_cast<T&&>() 的語(yǔ)義不是將一個(gè)對(duì)象轉(zhuǎn)換為一個(gè)引用,而是轉(zhuǎn)換對(duì)象的值類別,使其能被對(duì)應(yīng)的引用綁定。

// 左值轉(zhuǎn)換為左值
int a = 1;
static_cast<int&>(a) = 2;
std::cout << a << std::endl;
// 輸出:2
// 左值轉(zhuǎn)換為右值
int a = 1;
int&& b = static_cast<int&&>(a);
b = 2;
std::cout << a << std::endl;
// 輸出:2
// 右值轉(zhuǎn)換為右值,轉(zhuǎn)換前對(duì)象為非字面量
int a = 1;
int&& b = static_cast<int&&>(static_cast<int&&>(a));
b = 2;
std::cout << a << std::endl;
// 輸出:2

2. 借助值類別轉(zhuǎn)換進(jìn)行 OOP 轉(zhuǎn)換

這種情況帶有值類別轉(zhuǎn)換,屬于同對(duì)象轉(zhuǎn)換。

// upcast
struct A
{
    int x = 1;
};

struct B : A
{
};

B b;
static_cast<A&>(b).x = 2;
std::cout << b.x << std::endl;
// 輸出:2
// downcast
struct A
{
    int x = 1;
};

struct B : A
{
};

B b;
static_cast<B&>(static_cast<A&>(b)).x = 2;
std::cout << b.x << std::endl;
// 輸出:2
// sidecast
struct A1
{
    virtual void f1() {}
    int x = 1;
};

struct A2
{
    virtual void f2() {}
    int y = 1;
};

struct B : A1, A2
{
};

B b;
dynamic_cast<A2&>(static_cast<A1&>(b)).y = 2;
std::cout << b.y << std::endl;
// 輸出:2

2. 借助值類別轉(zhuǎn)換進(jìn)行 const_cast 轉(zhuǎn)換

這種情況帶有值類別轉(zhuǎn)換,也是同對(duì)象轉(zhuǎn)換。注意:通過(guò) const_cast 修改原本為 const 的對(duì)象是未定義行為。

struct A
{
    int x = 1;
};

{
    int a;
    const_cast<int&>(const_cast<const int&>(a)) = 2;
    std::cout << a << std::endl;
}
{
    A a;
    const_cast<A&>(const_cast<const A&>(a)).x = 2;
    std::cout << a.x << std::endl;
}
/* 輸出:
2
2
*/

二、異對(duì)象轉(zhuǎn)換

所有的非值類別轉(zhuǎn)換都是異對(duì)象轉(zhuǎn)換。

1. 普通的類型轉(zhuǎn)換

// 標(biāo)量類型
int a = 1;
int&& b = static_cast<int>(a);
b = 2;
std::cout << a << std::endl;
// 輸出:1

 

// 類類型
struct A
{
    A() {
        std::cout << "A::A() " << x << std::endl;
    }
    A(const A&) {
        std::cout << "A::A(const A&) " << x << std::endl;
    }
    ~A() {
        std::cout << "A::~A() " << x << std::endl;
    }
    int x = 1;
};

A a;
A&& b = static_cast<A>(a);
b.x = 2;
std::cout << b.x << std::endl;
/* 輸出:
A::A() 1
A::A(const A&) 1
2
A::~A() 2
A::~A() 1
*/

2. 指針轉(zhuǎn)換

轉(zhuǎn)換之后,指針本身是異對(duì)象,指針?biāo)傅膶?duì)象是同對(duì)象。這種情況也包含:借助指針進(jìn)行 OOP 轉(zhuǎn)換,借助指針進(jìn)行 const_cast 轉(zhuǎn)換。

int* a = new int;
std::cout << a << std::endl;
int* && r = static_cast<int*>(a);
r = nullptr;
std::cout << a << std::endl;
/* 輸出:
0x1ffdeb0 0x1ffdeb0
*/

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

相關(guān)文章

  • 合并排序(C語(yǔ)言實(shí)現(xiàn))

    合并排序(C語(yǔ)言實(shí)現(xiàn))

    遞歸算法是把一個(gè)問(wèn)題分解成和自身相似的子問(wèn)題,然后再調(diào)用自身把相應(yīng)的子問(wèn)題解決掉。這些算法用到了分治思想。
    2013-02-02
  • C++ 賦值構(gòu)造函數(shù)注意點(diǎn)介紹

    C++ 賦值構(gòu)造函數(shù)注意點(diǎn)介紹

    下面小編就為大家?guī)?lái)一篇C++ 賦值構(gòu)造函數(shù)注意點(diǎn)介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 使用Clion刷LeetCode的方法

    使用Clion刷LeetCode的方法

    這篇文章主要介紹了使用Clion刷LeetCode的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • C++生成隨機(jī)浮點(diǎn)數(shù)的示例代碼

    C++生成隨機(jī)浮點(diǎn)數(shù)的示例代碼

    在C++11之前,我們通常采用rand函數(shù)來(lái)生成隨機(jī)數(shù),但rand函數(shù)對(duì)一些情況顯得難以處理。本文將介紹如何利用C++生成隨機(jī)浮點(diǎn)數(shù),需要的可以參考一下
    2022-04-04
  • C語(yǔ)言實(shí)現(xiàn)大學(xué)生考勤管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)大學(xué)生考勤管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)大學(xué)生考勤管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C語(yǔ)言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié)

    C語(yǔ)言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié)

    這篇文章主要介紹了C語(yǔ)言中一些將字符串轉(zhuǎn)換為數(shù)字的函數(shù)小結(jié),分別為atoi()函數(shù)和atol()函數(shù)以及atof()函數(shù),需要的朋友可以參考下
    2015-08-08
  • c++ vector造成的內(nèi)存泄漏問(wèn)題

    c++ vector造成的內(nèi)存泄漏問(wèn)題

    這篇文章主要介紹了c++ vector造成的內(nèi)存泄漏問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)三子棋小游戲全程詳解

    C語(yǔ)言實(shí)現(xiàn)三子棋小游戲全程詳解

    完成一個(gè)三子棋的代碼并不是很難,有困難且重要的是完成這個(gè)游戲代碼所具備的思想,因?yàn)樗枷肷系倪M(jìn)步才是真正的進(jìn)步,當(dāng)我們有了這個(gè)思想上的武器,寫出別的代碼,難度就不會(huì)高
    2022-05-05
  • 簡(jiǎn)單總結(jié)C++中指針常量與常量指針的區(qū)別

    簡(jiǎn)單總結(jié)C++中指針常量與常量指針的區(qū)別

    這里我們來(lái)簡(jiǎn)單總結(jié)C++中指針常量與常量指針的區(qū)別,包括如何聲明和使用常量指針以及指針常量,需要的朋友可以參考下
    2016-06-06
  • C語(yǔ)言怎樣用指針指向字符串

    C語(yǔ)言怎樣用指針指向字符串

    這篇文章主要介紹了C語(yǔ)言怎樣用指針指向字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論

石泉县| 龙岩市| 天峨县| 邳州市| 绥化市| 调兵山市| 广南县| 成安县| 和静县| 清涧县| 富顺县| 石楼县| 平利县| 文安县| 东源县| 安国市| 花垣县| 梅河口市| 曲麻莱县| 宜州市| 年辖:市辖区| 崇州市| 白城市| 哈尔滨市| 宁陕县| 若尔盖县| 岑巩县| 元朗区| 霸州市| 绥阳县| 德清县| 新乐市| 赞皇县| 阿克苏市| 麻江县| 仁布县| 石嘴山市| 巴马| 盐津县| 长泰县| 星子县|