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

C++引用和強制類型轉換問題小結

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

引用

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

語法:數據類型 &引用名 = 原變量名

#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. **定義方式**:使用 `&` 符號聲明引用

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

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

int &ref; 錯誤!引用必須初始化

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

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

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

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

引用的應用場景

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

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

2. **作為函數返回值**:可以返回函數內部靜態(tài)變量或外部變量的引用,允許鏈式操作

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

3. **在類中使用**:常用于運算符重載和避免對象拷貝

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

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

注意事項

1. 不要返回局部變量的引用,因為局部變量在函數結束后會被銷毀,引用會變成懸空引用

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

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

const int &ref1 = 100;   合法
const int &ref2 = a + b;   合法,引用表達式結果

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

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

本質

C++中,引用的底層實現是指針常量( int*const p)指針的指向不可改,但指向的值可以改。編譯器會自動將引用操作轉換為指針操作,因此引用的語法更簡潔,但本質和指針類似。

int a=10; int&b=a; 等價于int*const b=&a; b=20; 等價于*b=20;

常量引用

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

語法:const數據類型 &引用名 = 原變量;

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

強制類型轉換

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

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

示例:

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

2. dynamic_cast:動態(tài)類型轉換(運行時檢查)

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

運行

class Base { virtual void f() {} };   含虛函數,多態(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、向下轉型父類指向子類
    Father *father = new Son;
    Son *son = dynamic_cast<Son *>(father);
    son->fun();
     2、向下轉型父類指向父類  不安全,返回 nullptr
    Father *father1 = new Father;
    Son *son1 = dynamic_cast<Son*>(father1);
    if (son1==nullptr)
    {
        cout<<"我是空指針"<<endl;
    }
    return 0;
}

3. const_cast:常量性轉換

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

運行

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

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

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

運行

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

總結

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

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

相關文章

  • C語言數據結構之順序數組的實現

    C語言數據結構之順序數組的實現

    這篇文章主要介紹了C語言數據結構之順序數組的實現的相關資料,這里提供實現實例,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-08-08
  • VS2019配置opencv詳細圖文教程和測試代碼的實現

    VS2019配置opencv詳細圖文教程和測試代碼的實現

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

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

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

    C語言 數據結構與算法之字符串詳解

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

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

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

    利用c++編寫簡易版2048小游戲

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

    教你Clion調試ROS包的方法

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

    c語言中缺省參數的類型總結

    在本篇文章里小編給大家整理了一篇關于c語言中缺省參數的類型總結內容,有興趣的朋友們可以跟著學習參考下。
    2021-09-09
  • VC++中進程與多進程管理的方法詳解

    VC++中進程與多進程管理的方法詳解

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

    C語言實現簡易的三子棋小游戲

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

最新評論

辽中县| 工布江达县| 周至县| 乌兰浩特市| 阳山县| 黔南| 册亨县| 石首市| 临武县| 屯昌县| 太白县| 虎林市| 新竹市| 贵州省| 广平县| 连平县| 堆龙德庆县| 固镇县| 鄂托克前旗| 泾川县| 乌拉特中旗| 梅州市| 灵丘县| 射阳县| 孙吴县| 都匀市| 留坝县| 兴安盟| 平顺县| 灵丘县| 广西| 江都市| 太仆寺旗| 怀安县| 乌拉特中旗| 和平区| 徐水县| 新源县| 汶川县| 罗定市| 南皮县|