C 類隱式轉換

2021-08-19 19:02:39 字數 985 閱讀 7887

class date

string date;

};void printdate(date &date);

int main()

void printdate(date &date)

{出現提示之後就開始捋思路

首先類隱式轉換的過程

1、**執行了接受string型別的date類建構函式

2、通過建構函式建立了乙個臨時的date物件,隨後將物件作為初始值來初始化printdate的date物件引用

根據提示資訊,錯誤明顯發生在第二步,所以問題轉變為非常量引用的初始化,根據提示臨時的date物件不是左值,網上搜了一下,發現確實臨時物件具有不可更改的屬性,也就是自帶頂層const,問題出在printdate的形參型別上,改為const date &date解決。

又回顧了c++ primer關於對const引用的描述,答案更加清晰了:

舉例:double dval = 3.14;

const int &ri = dval;

此處ri引用了乙個int型的數,但dval是乙個雙精度浮點數,因此為了確保ri繫結乙個整數,編譯器把上述**轉換如下:

const int temp = dval;//隱式型別轉換,同類隱式轉換乙個道理

const int &ri = temp;

監視&ri和&dval發現確實是兩個不同的位址,其中&ri儲存的是整數3,&dval儲存的浮點數,所以說確實生成了臨時量。

假設ri不是常量引用,就允許通過ri改變dval的值,但是由於隱式型別轉換的存在,修改ri的值僅僅影響臨時量的值,不能影響dval的值,所以用非常量引用 引用 其他型別(可轉換)的物件沒有意義,c++語言將這種行為歸為非法。

回到最開始的問題上,也就是說:

string s = "hello,world!";

date &date = s;//非法,需要加上頂層const

const date &date = s;//正確

至此問題解決。

C 類型別隱式轉換

隱式類型別轉換 可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的乙個隱式轉換。c primer 首先要單個實參,你可以把建構函式colour的預設實參去掉,也就是定義乙個物件必須要兩個引數的時候,檔案編譯不能通過。以上只是將內建型別轉換為自定義型別 過載double,int 將使用者自定義資...

C 隱式類型別轉換

c primer 中提到 可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。那麼,什麼是 隱式轉換 呢?上面這句話也說了,是從 建構函式形參型...

C 隱式類型別轉換

c primer 中提到 可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的乙個隱式轉換。這裡應該注意的是,可以用單個形參進行呼叫 並不是指建構函式只能有乙個形參,而是它可以有多個形參,但那些形參都是有預設實參的。那麼,什麼是 隱式轉換 呢?上面這句話也說了,是從 建構函式形參型...