日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網(wǎng)站首頁 編程語言 正文

c++隱式類型轉(zhuǎn)換存在的問題解析_C 語言

作者:咪啪魔女 ? 更新時間: 2022-05-01 編程語言

什么是隱式轉(zhuǎn)換:

c++中的基本類型并非完全對立,部分類型之間是可以進行隱式轉(zhuǎn)換的,所謂隱式轉(zhuǎn)換,是指不需要用戶干預,編譯器私下進行的類型轉(zhuǎn)換行為,很多時候用戶都不知道具體進行了哪些轉(zhuǎn)換

為什么要進行隱式轉(zhuǎn)換:

隱式轉(zhuǎn)換可以讓程序員在兩個不同類型的數(shù)據(jù)直接進行操作,而不用自行轉(zhuǎn)換類型,隱式轉(zhuǎn)換給程序開發(fā)者帶來了不小的便捷

隱式轉(zhuǎn)換的原則:

  • 基本數(shù)據(jù)類型的轉(zhuǎn)換以取值范圍作為轉(zhuǎn)換基礎(保證精度不丟失)
  • 隱式轉(zhuǎn)換發(fā)生在從小 ——> 大的轉(zhuǎn)換中。如char轉(zhuǎn)換為int,int轉(zhuǎn)換成double

目標代碼

旨在弄懂下面的代碼,明確變量a1,a2,a3在創(chuàng)建時編譯器究竟干了那些事:

#include
using namespace std;
class A{
public:
    int x;
    A() {cout<<"A()"<

運行結(jié)果:

構(gòu)造函數(shù)定義的隱式類型轉(zhuǎn)換

任何只接受一個參數(shù)的構(gòu)造函數(shù),都隱式地定義了由該參數(shù)向該類型的隱式類型轉(zhuǎn)換

A(int i)定義了一個由int向A的隱式類型轉(zhuǎn)換

所以,在任何使用A對象的地方,可以用一個int代替,此時,int會轉(zhuǎn)換為一個A類型臨時變量

如對a1變量的賦值操作:

A a1;   //聲明a1,a1被默認初始化
a1 = 2; //2轉(zhuǎn)換為A類型的臨時變量,對a1進行賦值操作

對于隱式類型轉(zhuǎn)換,需要注意兩點:

隱式類型轉(zhuǎn)換只允許一步轉(zhuǎn)換

class B{
public:
    string B_s;
    B() = default;
    B(string s) : B_s(s){};
};
int main(){
    B b1,b2;
    //錯誤:char*->string->B,進行了兩步轉(zhuǎn)換
    b1 = "hello"; 
    b2 = string("hello");
    return 0;
}

接受隱式類型轉(zhuǎn)換得到的對象的函數(shù),參數(shù)傳遞方式必須是const引用傳遞

因為c++中,一般不修改臨時對象,所以臨時對象只能傳遞給const引用。

分析a1

A a1:

a1進行默認初始化,調(diào)用默認構(gòu)造函數(shù)A()

a1 = 2

  • 字面量2隱式轉(zhuǎn)換為A類型的臨時對象
  • 該臨時對象通過拷貝運算符operator=拷貝給a1
  • 因為是臨時對象,所以operator=必須接受const引用,否則造成編譯錯誤

分析a2

A a2 = 2

  • 字面量2隱式轉(zhuǎn)換為A類型的臨時對象
  • 用臨時對象來拷貝初始化a2,調(diào)用拷貝構(gòu)造函數(shù)A(const A&),相當于A a2(A(2))
  • 因為是臨時對象,所以拷貝構(gòu)造函數(shù)A(const A&)必須接受const引用,否則造成編譯錯誤

特別注意

編譯器會將A a2(A(2))優(yōu)化為A a2(2)

所以程序輸出“A(int i)”,而不是“A(const A&)”

但是底層仍然調(diào)用了A(const A&),所以如果把A(const A&)改為A(A&),會造成編譯錯誤 error: cannot bind non-const lvalue reference of type 'A&' to an rvalue of type 'A'

這提示我們,在編寫c++程序時,如果不改變對象的值,那么習慣性地采用const引用會避免許多難解的編譯錯誤

分析a3

用a1直接初始化a3,調(diào)用A(const A&)

原文鏈接:https://www.cnblogs.com/timothy020/p/15948051.html

欄目分類
最近更新