1. 程式人生 > >C++型別的隱式轉換和顯式轉換

C++型別的隱式轉換和顯式轉換

隱式轉換:編譯器根據需要自動轉換變數型別。

1、一些基本型別的轉換

double d = 82.0;
int i = d;

2、類的隱式轉換,以下幾種情況,類B能隱式轉換成類A:

(1)B公有繼承A,然後用子類去初始化基類

class B: class A{}
A a;
B b;
a =b;

(2)B中有型別轉換函式
class B{
      operator A();
};
A a;
B b;
a = b;
(3)A實現了非explicit的引數為B的建構函式
class A{
     A(const B&);
};
A a;
B b;
a = b;
顯示轉換:也稱為強制型別轉換,要定義型別轉換成要用的值的型別
。如
int *ip;
char* pc = (char*)ip;
C++有四大強制型別轉換符:reinterpret_cast, const_cast, static_cast, dynamic_cast.使用形式為:cast-name<type>(expression)

1、reinterpret_cast:最普通的強制型別轉換符,與用圓括號將型別括起來實現一樣

int* ip;
char* pc = reinterpret_cast<char*>(ip);

2、const_cast:去掉表示式的const性質
const char* pc_str;
char* pc = const_cast<char*>(pc_str); //新的表示式pc則消除了const性質
3、static_cast:編譯器可以隱式轉換的任何型別都可以由static_cast完成。僅當型別之間可隱式轉換時(除類層次間的下行轉換以外),static_cast才是合法的。咋一看這個static_cast顯得有點多此一舉了,但其實這樣可以提高隱式轉換的安全性。注意:C++基本型別(int,char等)的指標之間不能含有隱式轉換,必須要用顯示轉換,所以如果static_cast裡有基本型別的指標轉換則是錯誤的。
class base{};
class child:public base{};
base* b;
child * c;
c = static_cast<child*>(b);  //下行轉換,正確
char* p = str;
int* p1 = static_cast<int*>(p); 
//錯誤,指標不能有隱式轉換,所以用static_cast也
//是錯誤的。

4、dynamic_cast:主要用於類層次間的上行轉換和下行轉換,也就是用於判斷基類指標和子類指標的轉換是否正確,如果錯誤則返回空指標。上行轉換指用派生類去初始化基類,這是沒問題的;下行轉換,如果基類指標指向的是派生類,則轉換成功,如果基類指標指向的是基類,則不能轉換,返回空指標。dynamic_cast也可以用來轉換兄弟類,如base1,base2相互轉換。

dynamic_cast使用有幾個前提:(1)type必須是類的指標、類的引用,或者void*(2)必須要有虛擬函式表,也就是說如果要進行類的型別轉換,則必須是定義了虛擬函式的類。

class B{
public:
     B():b(1){}
     virtual void foo(){};
     int b;
}

class D:public B{
public:
     D():d(2){}
     int d;
}

void fun(B* pb){
     D* pd1 = dynamic_cast<D*>(pb);
}
上面這段程式碼,對於函式fun(pb),如果
B* pb = new D;
fun(pb);

則是正確的,因為基類的指標指向派生類,轉換成功。而如果

B*pb = new B;
fun(pb);

則是錯誤的,因為基類的指標指向基類,不能用基類去初始化派生類,所以錯誤,此時pd1將返回空指標,將會發生異常,從而能夠更早的發現錯誤。

相關推薦

C++型別轉換轉換

隱式轉換:編譯器根據需要自動轉換變數型別。 1、一些基本型別的轉換 double d = 82.0; int i = d; 2、類的隱式轉換,以下幾種情況,類B能隱式轉換成類A: (1)B公有繼承A,然後用子類去初始化基類 class B: class A{} A a;

C#的型別轉換型別轉換

C#的隱式型別轉換和顯式型別轉換 C#的隱式型別轉換     在C#語言中,一些預定義的資料型別之間存在著預定義的轉換。比如,從int型別轉換到long型別。C#語言中資料型別的轉換可以用分為兩 類:隱式轉換(implicit conversions)和顯式轉換(expli

轉換轉換

string 運算 依次 col 指向 pri ast 現象 style C/C++對於數據類型的轉換包括隱式轉換和顯式轉換(強制類型轉換)。 一般來說,隱式轉換包括以下幾種情形: 1. 低精度與高精度混合運算,低精度會隱式轉換成高精度類型。 int a = 10; do

java引數引數

      隱式引數:是呼叫函式的物件,在類的方法中呼叫了類的例項域,這個被呼叫的例項域就是隱式引數。或者說是當前方法的物件, 一般我們會使用this關鍵字來使用隱式引數,this表示呼叫該方法的當前類的當前例項,使用this關鍵字可以很好的把顯式引數和隱式引

Selenium中的等待等待

在Selenium中,“等待”在執行測試中起著重要作用。在本文中,您將學習Selenium中“隱式”和“顯式”等待的各個方面。 在本文中,您將學習 - 2. 隱瞞等待 3. 明確等待 4. 流利的等待 為什麼我們需要在Selenium中等待? 大多數Web應用

PostgreSQL中的連線連線

連線有多種形式,例如內連線,外連線,交叉連線,自連線等。但是最重要的區別之一是隱式連線和顯式連線之間的區別。 隱式連線 FROM子句後面直接列出多個表名,這種連線方式即屬於內連線,是隱式連線。 示例: postgres=# CREATE TABLE test_1(id int, cl

selenium的等待等待及cookie操作

頁面等特: 現在的網頁越來越多采用了Ajax技術,這樣程式便不能確定何時某個元素完全加載出來,入股實際頁面等待時間過長導致某個dom元素還沒出來,但是你的程式碼直接使用了這個 Webelement,那麼就會上Nullpointerf的異常,為了解決這個問題,所以 Selenium提 供了兩種等待方

父類構造器的呼叫呼叫

當呼叫某個類的構造器來建立Java物件時,系統總會先呼叫父類的非靜態初始化塊進行初始化.這個呼叫是隱式執行的,而且父類的靜態初始化塊總是會被執行.接著會呼叫父類的一個或多個構造器執行初始化,這個呼叫既可以是通過super進行顯式呼叫,也可以是隱式呼叫. 當所有父類的非靜態初

python網路資料探勘--JS等待等待

第一部分:隱式等待和顯式等待      隱式等待和顯式等待的不同之處在於,隱式等待是等DOM中某個狀態發生改變後再繼續執行程式碼(沒有明確的等待時間,但是有最大等待期限,只要在時限內就可以),而顯式等待明確設定了等待時間,如上篇文章中等待三秒鐘。在隱式等待中,DOM被觸發的

C# 關鍵字explicit(顯示),implicit(),類型的轉換

tar oid bsp color col 必須 code 類型 顯示 class Program { static void Main(string[] args) { Adaptee ada = ne

C#程式設計基礎第十課:C#中的常用資料型別轉換轉換轉換、Convert類轉換

知識點:型別轉換、數值型別間的轉換、隱式型別轉換、顯式型別轉換、數值型別和string型別的轉換、Convert類轉換。 1、資料型別型別轉換 理解:從根本上說是型別鑄造,或者說是把資料從一種型別轉換為另一種型別。C#有多種資料型別,在使用各種型別的資料時,有時候需要將一種型別的資料轉換

C#】氣泡排序、轉換、函式及異常處理

一、普通氣泡排序: C#中常見的排序方法有:氣泡排序,快速排序,插入排序,選擇排序、堆排序以及歸併排序。雖然還沒學習過,但是也有耳聞,就先把它們先歸類。今天主要講這裡面最常見的氣泡排序。 【概念】 氣泡排序也就是講一組需要排序的數,進行從小到大,或從大到小的排列。計算機

自定義轉換 public static implicit operator 轉換

例子:對使用者user中,使用者名稱first name和last name進行轉換成合成一個限定長度為10個字元新name。 自定義隱式轉換: namespace transduction { public partial class transductionFo

C++構造與構造

<一>  class Stock { private: string _company; long _share; double _val; }; C++提供了兩種使用建構函式來初始化物件的方法。第一種是顯式的呼叫建構函式: Stock

從"void*"到指向非"void"的指標的轉換要求型別轉換錯誤

錯誤程式碼:struct People * p = malloc(sizeof(struct People));正確程式碼:struct People * p = ( People *)malloc(sizeof(struct People));

行內函數行內函數

   讓一個函式成為行內函數,隱式的為在類裡定義函式,顯式的則是在函式前加上inline關鍵字說明。 // //  inline1.cpp //  C++primary // //  Created by amesty on 16/5/11. //  Copy

前向後項差分尤拉法

摘要: 本文主要介紹前向後向差分,顯式隱式尤拉法及其穩定性分析。 前向差分對應顯式方法,後向差分對應隱式方法。顯式尤拉法是比較流行的顯式方法,隱式尤拉法是比較流行的隱式方法。 顯式尤拉法條件穩定,對積分步長有要求,隱式尤拉法無條件穩定,對

Selenium系列(六) - 強制等待、等待、等待詳細介紹原始碼解讀

如果你還想從頭學起Selenium,可以看看這個系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html   其次,如果你不懂前端基礎知識,需要自己去補充哦,博主暫時沒有總結(雖然我也會,所以我學selenium就不用複習前端了哈哈哈.

C++中函數模板,具體化,實例化:

程序 使用 集合 typename 內容 方法 區分 bsp 代碼 函數模板 形如: template<typename T> //沒有分號 void func(T &a,T &b); 稱為函數模板,其中,template和typename為關

自學C#第二篇 變量表達

作用 -s 組合 示例 表達式 技術分享 怎麽 就是 截圖 變量 1> 聲明變量需要指定類型和變量名: <type> <name> type:表示使用什麽類型來儲存數據name: 表示存儲這個類型的名字實例:(每一個聲明都是一條語句,語句以