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

C++引用和強(qiáng)制類型轉(zhuǎn)換問題小結(jié)

 更新時(shí)間:2025年10月27日 15:04:24   作者:和編程干到底  
本文給大家介紹C++引用和強(qiáng)制類型轉(zhuǎn)換問題,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

引用

引用是變量的別名,操作引用等同于操作原變量(共享同一塊內(nèi)存)

語法:數(shù)據(jù)類型 &引用名 = 原變量名

#include <iostream>
#include<string>
using namespace std;
int main()
{
    int a = 20;
    int& b = a; b是a的引用(別名)
    cout << "a=" << a << ",b=" << b << endl;
    cout << "a的地址" << &a << ",b的地址" << &b << endl;
    b = 20;
    cout << "a=" << a << ",b=" << b << endl;
    return 0;
}

1. **定義方式**:使用 `&` 符號(hào)聲明引用

int a = 10; int &ref = a; ref 是變量 a 的引用(別名)

2. **必須初始化**:引用在聲明時(shí)必須初始化,不能像指針一樣先聲明后賦值

int &ref; 錯(cuò)誤!引用必須初始化

3. **一旦綁定,不能更改**:引用一旦與某個(gè)變量綁定,就不能再改為引用其他變量

int a = 10, b = 20; int &ref = a; ref 引用 a ref = b; 這是將 b 的值賦給 a,而不是讓 ref 引用 b

4. **操作引用即操作原變量**:對(duì)引用的任何操作都會(huì)直接影響原變量

int a = 10; int &ref = a; ref++; 等價(jià)于 a++ cout << a; 輸出 11

引用的應(yīng)用場(chǎng)景

1. **作為函數(shù)參數(shù)**:避免參數(shù)傳遞時(shí)的拷貝,提高效率,同時(shí)允許函數(shù)修改實(shí)參

void swap(int &x, int &y) 
{ int temp = x; x = y; y = temp; } 調(diào)用時(shí)直接傳遞變量,而非指針 int a = 10, b = 20; swap(a, b); a 和 b 的值會(huì)被交換

2. **作為函數(shù)返回值**:可以返回函數(shù)內(nèi)部靜態(tài)變量或外部變量的引用,允許鏈?zhǔn)讲僮?/strong>

int &max(int &x, int &y) {
    return (x > y) ? x : y;
}
int a = 10, b = 20;
max(a, b) = 30;   將較大的變量(b)賦值為 30

3. **在類中使用**:常用于運(yùn)算符重載和避免對(duì)象拷貝

class MyClass {
private:
    int value;
public:
    MyClass(int v) : value(v) {}
    int &getValue() { return value; }   返回成員變量的引用
};
MyClass obj(10);
obj.getValue() = 20;   通過引用修改私有成員變量   

引用與指針的區(qū)別

注意事項(xiàng)

1. 不要返回局部變量的引用,因?yàn)榫植孔兞吭诤瘮?shù)結(jié)束后會(huì)被銷毀,引用會(huì)變成懸空引用

int &badFunction() {
    int x = 10;
    return x;    錯(cuò)誤!返回局部變量的引用
}  

2. 可以聲明常量引用(`const` 引用)來引用常量或臨時(shí)值

const int &ref1 = 100;   合法
const int &ref2 = a + b;   合法,引用表達(dá)式結(jié)果

3. 引用可以用于任何基本類型、自定義類型,甚至數(shù)組和函數(shù)

引用提供了一種簡(jiǎn)潔、安全的方式來操作變量,在很多情況下可以替代指針,使代碼更易讀、更安全。但也要注意其使用限制,避免出現(xiàn)懸空引用等問題。

本質(zhì)

C++中,引用的底層實(shí)現(xiàn)是指針常量( int*const p)指針的指向不可改,但指向的值可以改。編譯器會(huì)自動(dòng)將引用操作轉(zhuǎn)換為指針操作,因此引用的語法更簡(jiǎn)潔,但本質(zhì)和指針類似。

int a=10; int&b=a; 等價(jià)于int*const b=&a; b=20; 等價(jià)于*b=20;

常量引用

作用:防止通過引用修改原變量(用于保護(hù)實(shí)參),通常修飾函數(shù)形參。

語法:const數(shù)據(jù)類型 &引用名 = 原變量;

1、定義方式:在引用聲明前加 const 關(guān)鍵字
int a = 10;
const int &ref = a;   ref 是常量引用,綁定到 a
2、不能通過常量引用修改原變量:
int a = 10;
const int &ref = a;
ref = 20;   錯(cuò)誤!常量引用不允許修改所引用的變量
a = 20;     合法!原變量本身可以被修改(除非原變量也是 const)
3、可以引用常量或臨時(shí)值:普通引用不能直接引用常量或表達(dá)式結(jié)果,但常量引用可以
const int &ref1 = 100;        合法,常量引用可以引用字面量
const int &ref2 = 5 + 3;      合法,引用表達(dá)式結(jié)果
const int &ref3 = a * 2;      合法,引用變量運(yùn)算結(jié)果

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

1. static_cast:靜態(tài)類型轉(zhuǎn)換(最常用)

  • 用途:用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換(如 int ↔ double)、非 const 到 const 的轉(zhuǎn)換、父類與子類指針 / 引用之間的上行轉(zhuǎn)換(子類→父類,安全)。
  • 注意:不進(jìn)行運(yùn)行時(shí)類型檢查,不能用于無關(guān)類型轉(zhuǎn)換(如 int* ↔ double*),也不能移除 const 限定。

示例:

nt a = 10;
double b = static_cast<double>(a);   基本類型轉(zhuǎn)換
class Base {};
class Derived : public Base {};
Derived d;
Base* b_ptr = static_cast<Base*>(&d);   子類指針→父類指針(安全)

2. dynamic_cast:動(dòng)態(tài)類型轉(zhuǎn)換(運(yùn)行時(shí)檢查)

  • 用途:主要用于多態(tài)類型(含虛函數(shù)的類)的指針或引用轉(zhuǎn)換,尤其是父類到子類的下行轉(zhuǎn)換(父類→子類,需運(yùn)行時(shí)檢查安全性)。
  • 特點(diǎn):
    • 轉(zhuǎn)換指針時(shí),若不安全則返回 nullptr;
    • 轉(zhuǎn)換引用時(shí),若不安全則拋出 bad_cast 異常;
    • 必須用于多態(tài)類型(否則編譯錯(cuò)誤)。

運(yùn)行

class Base { virtual void f() {} };   含虛函數(shù),多態(tài)類型
class Derived : public Base {};
Base* b = new Derived;
Derived* d = dynamic_cast<Derived*>(b);   父類→子類,安全,返回非空指針
下面寫法不推薦
Base* b2 = new Base;
Derived* d2 = dynamic_cast<Derived*>(b2);   不安全,返回 nullptr
#include <string>
#include <iostream>
using namespace std;
class Father
{
public:
    virtual void fun()
    {
        cout << "我是父類" << endl;
    }
};
class Son : public Father
{
public:
    void fun()
    {
        cout << "我是子類" << endl;
    }
};
int main()
{
     1、向下轉(zhuǎn)型父類指向子類
    Father *father = new Son;
    Son *son = dynamic_cast<Son *>(father);
    son->fun();
     2、向下轉(zhuǎn)型父類指向父類  不安全,返回 nullptr
    Father *father1 = new Father;
    Son *son1 = dynamic_cast<Son*>(father1);
    if (son1==nullptr)
    {
        cout<<"我是空指針"<<endl;
    }
    return 0;
}

3. const_cast:常量性轉(zhuǎn)換

  • 用途:唯一能移除 const 或 volatile 限定符的轉(zhuǎn)換(僅針對(duì)指針或引用)。
  • 注意:若原對(duì)象本身是 const 的,通過轉(zhuǎn)換后修改它會(huì)導(dǎo)致未定義行為(UB)。

運(yùn)行

const int* p = new int(10);
int* q = const_cast<int*>(p);   移除 const 限定
*q = 20;   若原對(duì)象(*p)非 const,則合法;若原對(duì)象是 const,則 UB
 去除const屬性之后還是共用同一塊內(nèi)存
    int b=20;
    const int *p=&b;
    cout<<*p<<endl;
    int *p1=const_cast<int*>(p);
    *p1=40;
    cout<<*p<<endl;

4. reinterpret_cast:重新解釋類型轉(zhuǎn)換(最危險(xiǎn))

  • 用途:將一種類型的指針 / 引用直接轉(zhuǎn)換為另一種無關(guān)類型的指針 / 引用(如 int* ↔ double*),或整數(shù)與指針互轉(zhuǎn)。
  • 特點(diǎn):完全依賴編譯器實(shí)現(xiàn),不保證可移植性,通常用于底層操作(如硬件交互),謹(jǐn)慎使用。

運(yùn)行

int a = 0x12345678;
int* p = &a;
double* q = reinterpret_cast<double*>(p);  重新解釋指針類型(危險(xiǎn))

總結(jié)

  • 優(yōu)先使用 C++ 風(fēng)格的轉(zhuǎn)換,明確意圖:
    • 基本類型 / 上行轉(zhuǎn)換 → static_cast;
    • 多態(tài)類型下行轉(zhuǎn)換 → dynamic_cast;
    • 移除 const → const_cast;
    • 底層類型重解釋 → reinterpret_cast(盡量避免)。
  • 避免 C 風(fēng)格轉(zhuǎn)換,因其可能被編譯器解釋為上述任意一種,隱藏風(fēng)險(xiǎn)。

到此這篇關(guān)于C++引用和強(qiáng)制類型轉(zhuǎn)換問題小結(jié)的文章就介紹到這了,更多相關(guān)C++強(qiáng)制類型轉(zhuǎn)換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • VS2019配置opencv詳細(xì)圖文教程和測(cè)試代碼的實(shí)現(xiàn)

    VS2019配置opencv詳細(xì)圖文教程和測(cè)試代碼的實(shí)現(xiàn)

    這篇文章主要介紹了VS2019配置opencv詳細(xì)圖文教程和測(cè)試代碼的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 關(guān)于c++ 智能指針及 循環(huán)引用的問題

    關(guān)于c++ 智能指針及 循環(huán)引用的問題

    下面小編就為大家?guī)硪黄P(guān)于c++ 智能指針及 循環(huán)引用的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C語言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解

    C語言 數(shù)據(jù)結(jié)構(gòu)與算法之字符串詳解

    這篇文章將帶大家深入了解C語言數(shù)據(jù)結(jié)構(gòu)與算法中的字符串,文中主要是介紹了字符串的定義、字符串的比較以及一些串的抽象數(shù)據(jù)類型,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • C++11中的引用限定符示例代碼

    C++11中的引用限定符示例代碼

    C++中有左值和右值的概念,其實(shí),左值和右值的區(qū)分也同樣適用于類對(duì)象,本文中將左值的類對(duì)象稱為左值對(duì)象,將右值的類對(duì)象稱為右值對(duì)象,對(duì)C++11?引用限定符相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2023-01-01
  • 利用c++編寫簡(jiǎn)易版2048小游戲

    利用c++編寫簡(jiǎn)易版2048小游戲

    這篇文章主要介紹了如何讓利用c++編寫簡(jiǎn)易版的2048小游戲,感興趣的小伙伴請(qǐng)參考下面文章的具體內(nèi)容
    2021-09-09
  • 教你Clion調(diào)試ROS包的方法

    教你Clion調(diào)試ROS包的方法

    Clion是一款專門開發(fā)C以及C++所設(shè)計(jì)的跨平臺(tái)的IDE,本文給大家介紹Clion調(diào)試ROS包的方法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • c語言中缺省參數(shù)的類型總結(jié)

    c語言中缺省參數(shù)的類型總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于c語言中缺省參數(shù)的類型總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-09-09
  • VC++中進(jìn)程與多進(jìn)程管理的方法詳解

    VC++中進(jìn)程與多進(jìn)程管理的方法詳解

    這篇文章主要介紹了VC++中進(jìn)程與多進(jìn)程管理的方法,以實(shí)例形式詳細(xì)分析了進(jìn)程與多進(jìn)程管理中所涉及的進(jìn)程、子進(jìn)程、進(jìn)程的互斥運(yùn)行與進(jìn)程的結(jié)束等概念與具體實(shí)現(xiàn)方法,非常具有參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • C語言實(shí)現(xiàn)簡(jiǎn)易的三子棋小游戲

    C語言實(shí)現(xiàn)簡(jiǎn)易的三子棋小游戲

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

最新評(píng)論

精河县| 章丘市| 长治县| 台南县| 乌鲁木齐市| 庐江县| 宁津县| 来安县| 涞源县| 九龙城区| 馆陶县| 深水埗区| 巴楚县| 肇东市| 洛阳市| 肃北| 平邑县| 保德县| 阳江市| 虹口区| 延长县| 喀喇沁旗| 黄陵县| 海兴县| 商水县| 图木舒克市| 西充县| 广西| 枝江市| 定西市| 万安县| 武邑县| 扎赉特旗| 南召县| 北海市| 镇原县| 花莲县| 湟中县| 洛扎县| 苏尼特左旗| 湘乡市|