国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++類型轉換歸納總結

C++類型轉換歸納總結

2021-01-24 11:52C++教程網 C/C++

這篇文章主要介紹了C++類型轉換歸納總結,通過本文可以加深讀者對于C++變量類型及其相互轉換方法的理解,需要的朋友可以參考下

學過C++的人都知道,C++是強類型語言,因此變量在使用前就要聲明數據類型,不同數據類型分配的內存空間大小也是不同,在轉換類型時尤其需要注意這個問題,以防止數據丟失或越界溢出。本文將詳細歸納總結一下C++的類型轉換

C++從C發展而來,也繼承兩種C風格的轉換:隱式轉換顯式轉換

1.隱式轉換

隱式轉換是指由編譯系統自動進行,不需要人工干預的類型轉換,例如:

?
1
2
3
short a = 2000;
int b;
b = a;

隱式轉換,也包括構造函數和運算符的轉換,例如:

?
1
2
3
4
5
6
7
8
9
class A {};
class B {
public:
  B (A a) {}
};
 
 
A a;
B b = a;

2.顯式轉換

和隱式轉換相反,顯式轉換要利用強制類型轉換運算符進行轉換,例如:

?
1
2
3
4
double x = 10.3;
int y;
y = int (x);  // 函數式寫法
y = (int) x;  // C風格寫法

以上類型轉換已經滿足了基本類型的轉換了。但是如果想轉換類和指針,有時代碼可以編譯,在運行過程中會出錯。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
class CDummy {
  float i,j;
public:
  CDummy () { i=1; j=1; }
};
 
class CAddition {
  int x,y;
public:
  CAddition () { x=1; y=1; }
  int result() { return x+y;}
};
 
int main () {
 CDummy d;
 CAddition * padd;
 padd = (CAddition*) &d;
 std::cout << padd->result();
 return 0;
}

這段代碼會在運行期出錯,在執行padd->result()時發生異常,有些編譯器會異常退出。
傳統明確的類型轉換,可以轉換成任何其他指針類型任何指針,它們指向的類型無關。在隨后的調用成員的結果,會產生一個運行時錯誤或意外的結果。

C++標準轉換運算符

傳統的類和指針的類型轉換方式很不安全,可能會在運行時異常退出,標準C++ 提供了四個轉換運算符:dynamic_cast、reinterpret_cast、static_cast、 const_cast
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
const_cast <new_type> (expression)

1.dynamic_cast

dynamic_cast只能用于指針和引用的對象。其目的是確保類型轉換的結果是一個有效的完成所請求的類的對象,所以當我們從一個類轉換到這個類的父類,dynamic_cast總是可以成功。dynamic_cast可以轉換NULL指針為不相關的類,也可以任何類型的指針為void指針。

?
1
2
3
4
5
6
7
class CBase { };
class CDerived: public CBase { };
CBase b;
CDerived d;
 
CBase* pb = dynamic_cast<CBase*>(&d);    // 子類轉父類,正確
//CDerived* pd = dynamic_cast<CDerived*>(&b); // 父類轉子類,錯誤

當新的類型不是被轉換的類型的父類,dynamic_cast無法完成指針的轉換,返回NULL當dynamic_cast轉換引用類型時,遇到失敗會拋出Bad_cast 異常

2.static_cast

static_cast可以執行相關的類的指針之間的轉換,可以在子類和父類之間相互轉換,但父類指針轉成子類指針是不安全的。static_cast沒有在運行時進行安全檢查,因此我們要先確保轉換是安全的。另一方面,static_cast對比dynamic_cast少了在類型安全檢查的開銷。

?
1
2
3
4
class CBase {};
class CDerived: public CBase {};
CBase * a = new CBase;
CDerived * b = static_cast<CDerived*>(a);

上述代碼是合法的,b指向一個不完整的對象,可能在運行期導致錯誤。
static_cast也可以用來執行任何其他非指針的轉換,如基本類型enum, struct, int, char, float等之間的標準轉換

?
1
2
3
double d = 3.14159265;
int i = static_cast<int>(d);
void* p = static_cast<void*>(&i); //任意類型轉換成void類型

3.reinterpret_cast

reinterpret_cast轉換成任何其他指針類型,甚至無關的類,任何指針類型。操作的結果是重新解釋類型,但沒有進行二進制的轉換。所有的指針轉換是允許的:不管是指針指向的內容還是指針本身的類型。

?
1
2
3
4
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B*>(a)

reinterpret_cast還可以用來轉換函數指針類型,例如:

?
1
2
3
4
5
typedef void(*Func)();         // 聲明一種函數指針定義,返回void
Func pFunc;              // 定義FuncPtr類型的數組
 
//pFunc = &test;             // 編譯錯誤!類型不匹配
pFunc = reinterpret_cast<Func>(&test); // 編譯成功!轉換函數指針類型

4.const_cast

const_cast用于操縱對象的常量性,去掉類型的const或volatile屬性

?
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
void print (char * str){
 std::cout << str ;
}
 
int main () {
 const char* c = "hello world";
 print ( const_cast<char *> (c) );
 return 0;
}

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美黄色一区二区 | 一区二区三区欧美 | 一区二区亚洲 | 国产精品福利电影网 | 天堂中文网 | 亚洲电影在线观看 | 亚洲精品久久久久中文字幕欢迎你 | 欧美freesex | 欧美国产日韩一区 | 香蕉视频成人在线观看 | 欧美日韩中文字幕 | 都市激情国产 | 久久久久综合狠狠综合日本高清 | 桃乃木香奈在线 | 日本中文字幕免费 | 伊人亚洲| 精品亚洲永久免费精品 | 成人av网站在线观看 | 国产精品免费一区二区三区四区 | 国产精品一区二区视频 | 国产一区二区三区视频在线观看 | 免费久久99精品国产婷婷六月 | 成av在线 | 日韩乱视频 | 成人午夜精品一区二区三区 | 日韩一区二区三区在线播放 | 亚洲精品毛片一区二区 | 国产精品久久久久无码av | 午夜视频免费 | 久久久久中文字幕 | 国产成人av在线播放 | 久久精品亚洲 | 奇米影视四色777me | 99国产精品久久久久久久成人热 | 美国特级a毛片免费网站 | 亚洲综合色视频在线观看 | 国产第一二区 | 色综合中文 | 91国在线产 | 成年网站在线观看 | 亚洲免费视频在线观看 |