C++引用和強制類型轉(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. **定義方式**:使用 `&` 符號聲明引用
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
引用的應(yīng)用場景
1. **作為函數(shù)參數(shù)**:避免參數(shù)傳遞時的拷貝,提高效率,同時允許函數(shù)修改實參
void swap(int &x, int &y)
{ int temp = x; x = y; y = temp; } 調(diào)用時直接傳遞變量,而非指針 int a = 10, b = 20; swap(a, b); a 和 b 的值會被交換2. **作為函數(shù)返回值**:可以返回函數(shù)內(nèi)部靜態(tài)變量或外部變量的引用,允許鏈式操作
int &max(int &x, int &y) {
return (x > y) ? x : y;
}
int a = 10, b = 20;
max(a, b) = 30; 將較大的變量(b)賦值為 303. **在類中使用**:常用于運算符重載和避免對象拷貝
class MyClass {
private:
int value;
public:
MyClass(int v) : value(v) {}
int &getValue() { return value; } 返回成員變量的引用
};
MyClass obj(10);
obj.getValue() = 20; 通過引用修改私有成員變量 引用與指針的區(qū)別

注意事項
1. 不要返回局部變量的引用,因為局部變量在函數(shù)結(jié)束后會被銷毀,引用會變成懸空引用
int &badFunction() {
int x = 10;
return x; 錯誤!返回局部變量的引用
} 2. 可以聲明常量引用(`const` 引用)來引用常量或臨時值
const int &ref1 = 100; 合法 const int &ref2 = a + b; 合法,引用表達式結(jié)果
3. 引用可以用于任何基本類型、自定義類型,甚至數(shù)組和函數(shù)
引用提供了一種簡潔、安全的方式來操作變量,在很多情況下可以替代指針,使代碼更易讀、更安全。但也要注意其使用限制,避免出現(xiàn)懸空引用等問題。
本質(zhì)
C++中,引用的底層實現(xiàn)是指針常量( int*const p)指針的指向不可改,但指向的值可以改。編譯器會自動將引用操作轉(zhuǎn)換為指針操作,因此引用的語法更簡潔,但本質(zhì)和指針類似。
int a=10; int&b=a; 等價于int*const b=&a; b=20; 等價于*b=20;
常量引用
作用:防止通過引用修改原變量(用于保護實參),通常修飾函數(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; 錯誤!常量引用不允許修改所引用的變量 a = 20; 合法!原變量本身可以被修改(除非原變量也是 const) 3、可以引用常量或臨時值:普通引用不能直接引用常量或表達式結(jié)果,但常量引用可以 const int &ref1 = 100; 合法,常量引用可以引用字面量 const int &ref2 = 5 + 3; 合法,引用表達式結(jié)果 const int &ref3 = a * 2; 合法,引用變量運算結(jié)果
強制類型轉(zhuǎn)換
1. static_cast:靜態(tài)類型轉(zhuǎn)換(最常用)
- 用途:用于基本數(shù)據(jù)類型之間的轉(zhuǎn)換(如 int ↔ double)、非 const 到 const 的轉(zhuǎn)換、父類與子類指針 / 引用之間的上行轉(zhuǎn)換(子類→父類,安全)。
- 注意:不進行運行時類型檢查,不能用于無關(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:動態(tài)類型轉(zhuǎn)換(運行時檢查)
- 用途:主要用于多態(tài)類型(含虛函數(shù)的類)的指針或引用轉(zhuǎn)換,尤其是父類到子類的下行轉(zhuǎn)換(父類→子類,需運行時檢查安全性)。
- 特點:
- 轉(zhuǎn)換指針時,若不安全則返回 nullptr;
- 轉(zhuǎn)換引用時,若不安全則拋出 bad_cast 異常;
- 必須用于多態(tài)類型(否則編譯錯誤)。
運行
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)換(僅針對指針或引用)。
- 注意:若原對象本身是 const 的,通過轉(zhuǎn)換后修改它會導(dǎo)致未定義行為(UB)。
運行
const int* p = new int(10);
int* q = const_cast<int*>(p); 移除 const 限定
*q = 20; 若原對象(*p)非 const,則合法;若原對象是 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)換(最危險)
- 用途:將一種類型的指針 / 引用直接轉(zhuǎn)換為另一種無關(guān)類型的指針 / 引用(如 int* ↔ double*),或整數(shù)與指針互轉(zhuǎn)。
- 特點:完全依賴編譯器實現(xiàn),不保證可移植性,通常用于底層操作(如硬件交互),謹慎使用。
運行
int a = 0x12345678; int* p = &a; double* q = reinterpret_cast<double*>(p); 重新解釋指針類型(危險)
總結(jié)
- 優(yōu)先使用 C++ 風格的轉(zhuǎn)換,明確意圖:
- 基本類型 / 上行轉(zhuǎn)換 → static_cast;
- 多態(tài)類型下行轉(zhuǎn)換 → dynamic_cast;
- 移除 const → const_cast;
- 底層類型重解釋 → reinterpret_cast(盡量避免)。
- 避免 C 風格轉(zhuǎn)換,因其可能被編譯器解釋為上述任意一種,隱藏風險。
到此這篇關(guān)于C++引用和強制類型轉(zhuǎn)換問題小結(jié)的文章就介紹到這了,更多相關(guān)C++強制類型轉(zhuǎn)換內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual Studio添加第三方庫的實現(xiàn)步驟
使用Visual Studio編寫C語言程序能夠提供全面而強大的開發(fā)環(huán)境,本文主要介紹了Visual Studio添加第三方庫的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07

