欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

C++ 正式分類方法是直接按語法分類,分為:隱式轉(zhuǎn)換和顯示轉(zhuǎn)換。隱式轉(zhuǎn)換又稱為標準轉(zhuǎn)換。顯示轉(zhuǎn)換又分為:C 風格轉(zhuǎn)換、函數(shù)風格轉(zhuǎn)換、C++ 風格轉(zhuǎn)換。C++風格轉(zhuǎn)換就是 static_cast、dynamic_cast、const_castreinterpret_cast 這 4 種。

有很長一段時間我都有這樣的疑問:轉(zhuǎn)換前的對象和轉(zhuǎn)換后的對象是不是同一個?

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

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

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

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

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

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

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

// 左值轉(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)換前對象為非字面量
int a = 1;
int&& b = static_cast<int&&>(static_cast<int&&>(a));
b = 2;
std::cout << a << std::endl;
// 輸出:2

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

這種情況帶有值類別轉(zhuǎn)換,屬于同對象轉(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)換進行 const_cast 轉(zhuǎn)換

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

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
*/

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

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

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

// 標量類型
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)換之后,指針本身是異對象,指針所指的對象是同對象。這種情況也包含:借助指針進行 OOP 轉(zhuǎ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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++ for循環(huán)與nullptr的小知識點分享

    C++ for循環(huán)與nullptr的小知識點分享

    這篇文章主要是來和大家介紹一些C++中的小知識點,本文分享的是for循環(huán)與nullptr,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-05-05
  • C++ STL入門教程(6) set(集合)的使用方法

    C++ STL入門教程(6) set(集合)的使用方法

    這篇文章主要為大家詳細介紹了C++ STL入門教程的第六篇,set集合的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 利用Matlab繪制地圖的超詳細教程

    利用Matlab繪制地圖的超詳細教程

    worldmap和usamap是axesm的子類,worldmap是用于生成世界地圖坐標區(qū)域,usamap用于生成美國地圖坐標區(qū)域。本文將詳細為大家介紹如何利用這兩個函數(shù)繪制地圖,需要的可以參考一下
    2022-02-02
  • Qt自定義控件實現(xiàn)線條型加載條

    Qt自定義控件實現(xiàn)線條型加載條

    這篇文章主要為大家詳細介紹了Qt自定義控件實現(xiàn)線條型加載條,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C/C++代碼操作MySQL數(shù)據(jù)庫詳細步驟

    C/C++代碼操作MySQL數(shù)據(jù)庫詳細步驟

    這篇文章主要給大家介紹了關(guān)于C/C++代碼操作MySQL數(shù)據(jù)庫的相關(guān)資料,通過文中的這些示例,我們可以連接到MySQL數(shù)據(jù)庫,并執(zhí)行常見的數(shù)據(jù)庫操作,如創(chuàng)建表、插入數(shù)據(jù)和查詢數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • c++ 完備的運行時類型信息(動態(tài)類型信息)

    c++ 完備的運行時類型信息(動態(tài)類型信息)

    這篇文章主要介紹了c++ 完備的運行時類型信息,需要的朋友可以參考下
    2017-07-07
  • C語言全排列回溯算法介紹

    C語言全排列回溯算法介紹

    大家好,本篇文章主要講的是C語言全排列回溯算法介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 基于Qt實現(xiàn)可拖動自定義控件

    基于Qt實現(xiàn)可拖動自定義控件

    這篇文章主要為大家詳細介紹了如何基于Qt實現(xiàn)可拖動自定義控件,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • C++ 實現(xiàn)優(yōu)先隊列的簡單實例

    C++ 實現(xiàn)優(yōu)先隊列的簡單實例

    這篇文章主要介紹了C++ 實現(xiàn)優(yōu)先隊列的簡單實例的相關(guān)資料,希望通過本文能幫助大家實現(xiàn)優(yōu)先隊列,需要的朋友可以參考下
    2017-08-08
  • C語言實現(xiàn)推箱子功能匯總

    C語言實現(xiàn)推箱子功能匯總

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)推箱子功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論