C++引用和強(qiáng)制類型轉(zhuǎn)換問題小結(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)賦值為 303. **在類中使用**:常用于運(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)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下2017-08-08
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ī)硪黄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)與算法中的字符串,文中主要是介紹了字符串的定義、字符串的比較以及一些串的抽象數(shù)據(jù)類型,感興趣的可以學(xué)習(xí)一下2022-01-01
C語言實(shí)現(xiàn)簡(jiǎn)易的三子棋小游戲
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)易的三子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08

