1. 程式人生 > >c++隱式的類型別轉換

c++隱式的類型別轉換

先看程式碼

#include <iostream>
#include <string>
using namespace std;
class Student
{
    string name;
    int number;
public:
    Student(const string &str, int n = 1) : name(str), number(n) {} 
    Student() {}
    void Print(const Student &s); //期待的是Student類的引數
};
void Student::Print(const
Student &s) { if (s.name == name) { cout << "same person" << endl; } else { cout << "different" << endl; } } int main() { Student a("lzj"); Student b("lb"); cout << "a == b ? : " <<endl; a.Print(b); cout
<< "a == a ? : " << endl; a.Print(string("lzj")); //這裡傳遞的是string類 // cout << "a == a ? : " << a.Print("lzj") << endl; return 0; }

輸出結果為

a == b ? :
different
a == a ? :
same person

為什麼呢? 明明第二個傳遞的是一個string類的引數,結果卻是same
這是因為c++裡,能通過一個實參呼叫的建構函式定義了一條從建構函式的引數型別向類型別隱式轉換的規則

(c++ primer P296)
也就是說,string類的實參被隱式轉換成了Student類型別,而當上面的建構函式裡的引數列表裡,不去預設給n賦初值的話,必須傳遞兩個實參的時候,也就不成立了
同時,編譯器只允許一步類型別轉換,意思也就是說,只會自動執行一步型別轉換,其實當我們建立物件時,傳遞進去的“lzj”和“lb”都被隱式的從const char 轉換成了string類,所以,被我註釋掉的那條語句編譯不會通過,因為只能一步的從const char 轉換為string,而不能再次轉換為類型別了

如何阻止:可以將建構函式宣告為explicit加以阻止,此時沒有任何建構函式可以隱式的建立類物件,explicit只對一個實參的建構函式有效,需要多個實參的建構函式不能用於執行隱式轉換,無須指定為explicit。只能在類內宣告建構函式時使用explicit,類外部定義時不應重複
而且,explicit建構函式只能用於直接初始化,不能用於拷貝形式的初始化過程。宣告為explicit後,編譯器將不會在自動轉換過程中使用該建構函式,但是,雖然編譯器不會將其使用於隱式轉換過程,但我們仍然可以使用這樣的建構函式顯示的強制轉換

相關推薦

C++ 型別轉換

《C++ Primer》中提到: “可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的一個隱式轉換。” 這裡應該注意的是, “可以用單個形參進行呼叫” 並不是指建構函式只能有一個形參,而是它可以有多個形參,但那些形參都是有預設實參的。 那麼,什麼是“隱式轉換

[C++]型別轉換(轉)

C++ primer 中有這麼一句話:可以用單個實參來呼叫的建構函式定義了從形參型別到該型別的一個隱式轉換。 這麼解釋: 比如有個類A的物件a的成員函式的引數應該是類A的物件,但是把一個別的型別B的物件b傳進去了,而且這個物件b的型別恰好是A的單引數建構函式

淺談C++(4)--型別轉換

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++ Primer 學習筆記 — 型別轉換

1.瞭解 explicit用來防止由建構函式定義的隱式轉換。要明白它的作用,首先要了解隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的一個隱式轉換。 #include <string> #include <iostream>

C++轉換函式和型別轉換

基礎型別轉換基礎型別轉為類型別類型別轉換為基礎型別 1、基礎型別轉換 基礎型別之間的型別轉換,滿足從低精度向高精度的自動轉換,規則如下: (char -> short)-> int -&

C++關鍵字explicit與型別轉換

最近在翻閱EffectiveC++一書,就邊學邊做筆記了,之前很多東西沒能及時整理上來,當時的想法是害怕自己在閱讀過程中很多東西不能夠理解的很深刻,之後就是不斷的遺忘再遺忘或者隨著時間的推移就不想去碼字了,時間真是個可怕的東西,年齡大了就開始害怕了。C++術語(Termino

型別轉換

以前我們構造物件的時候Fruit apple("apple")其實也已經有了一個轉換,從const char *的C字串格式,轉為string,在這裡,你再apple.isSame("apple")的話,蠢系統不懂得幫你轉換兩次,所以你必須要用 string()來先強制轉換,然後系統才知道幫你從string隱

C轉換

賦值運算符 有一個 ffffff 表達 計時 可能 不同類 類型 有時 這篇文章僅僅針對C語言存在的隱式類型轉換做一些分析,關於C++的這方面研究,有時間我再另外寫一篇文章。 關於隱式類型轉換,是指發生在沒有明確說明的情況下(C語言風格的強制類型轉換就是屬於我們程序員有明

強制轉換轉換

判斷 隱式類型轉換 ber num 隱式 字符串 oat 轉換 進行 強制類型轉換: parseInt() 將字符串強類型制轉換為數字整數類型 parseFloat() 將字符串類型轉換為浮點類型 Number() 只能將純數字的字符轉換為數字

oracle轉換

隱式類型轉換 sql 隱式轉換 parameter acl 南京 字符串類型 rac clas 我們的系統的的選擇框的選項是存儲在一個數據庫表中的,其中大致包含了選擇框的id以及選擇選項的數據,大致如下表。其中fieldid的類型為int,optionVal為int,opt

C++顯轉換

動作 primer 我們 ble ons 出錯 blog gre rtti C++顯式類型轉換 (註:本文例程改編自《C++ Primer》) 關於類型轉換,C++保留了C語言中的類型轉換方式,並提供了4中新的類型轉換方式。《Effective C++》鼓勵我們使用新的轉換

javascript的轉換

defined 檢測 cti 種類 AR amp string類型 控制 color 首先簡單了解js的typeof,會返回六種類型 即 number string boolen function object undefined 也就是六種基本數據類型 顯示類型轉換大概有

OpenCV中operator的轉換

c++構造函數 ons enc static 對象類型 構造函數 int truct log c++ operator操作符的兩種用法 重載和隱式類型轉換 今天學習OpenCV源碼的時候碰到這種寫法: template<typename _Tp> oper

JavaScript 轉換之:加號+

類型 類型轉換 隱式類型 符號 連接 scrip ava script 需要 加號+,有些情況下,它是算術加號,有些情況下,是字符串連接符號 如果字符串和數字相加,JavaScript會自動把數字轉換成字符,不管數字在前還是字符串在前 "2" + 3; // "23"

你不知道的js之強制型別轉換

你不知道的js之隱式強制型別轉換 1.| |和&& 注: undefined null false +0 -0 NaN ” ” 以上為假值,其餘都是boolean真值 &a

一步一步學習TypeScript(08./顯示型別轉換)

implicit/explicit cast (隱式/顯示型別轉換) TypeScript中可以顯示錶明物件的型別 . 轉換一個型別到其它型別時可以使用<>符號, 如 <T&g

如何編寫高效的SQL(一)---避免資料型別轉換

該篇文章根據網上的資料跟本人編寫SQL的那一點點經驗總結出來的,如果有什麼不準確的地方,請指正,感謝感謝! 避免潛在的資料型別轉換 在MySQL跟Oracle中,如果存在隱式的資料型別轉換,可能導致無法命中索引,從而進行全表掃描的危險。 例如: 錯誤

C++ Prime 之 型別轉換初步學習

隱式的類型別轉換 : 我們先定義一個類: class Person{ public: Person()=default; Person(const std::string &s_name):name(s_

解析JavaScript的轉換

bin typeof 基本類 引用類型 scrip pac follow one 根據 avaScript的數據類型分為六種,分別為null,undefined,boolean,string,number,object。object是引用類型,其它的五種是基本類型或者是原始

c++型別轉換

先看程式碼 #include <iostream> #include <string> using namespace std; class Student { string name; int number; pu