【轉】C++標準轉換運算符static_cast

static_cast<new_type> (expression)

雖然const_cast是用來去除變量的const限定,但是static_cast卻不是用來去除變量的static引用。其實這是很容易理解的,static決定的是一個變量的作用域和生命周期,比如:在一個文件中將變量定義為static,則說明這個變量只能在本Package中使用;在方法中定義一個static變量,該變量在程序開始存在直到程序結束;類中定義一個static成員,該成員隨類的第一個對象出現時出現,并且可以被該類的所有對象所使用。

對static限定的改變必然會造成范圍性的影響,而const限定的只是變量或對象自身。但無論是哪一個限定,它們都是在變量一出生(完成編譯的時候)就決定了變量的特性,所以實際上都是不容許改變的。這點在const_cast那部分就已經體現出來。

static_cast和reinterpret_cast一樣,在面對const的時候都無能為力:兩者都不能去除const限定。兩者也存在很多的不同,比如static_cast不僅可以用在指針和引用上,還可以用在基礎數據和對象上;reinterpret_cast可以用在"沒有關系"的類型之間,而用static_cast來處理的轉換就需要兩者具有"一定的關系"了。

常用場合

1、編譯器隱式執行的任何類型轉換都可以由static_cast來完成,比如int與float、double與char、enum與int之間的轉換等。

double a = 1.999;
int b = static_cast<int>(a); //相當于b = a ;

當編譯器隱式執行類型轉換時,大多數的編譯器都會給出一個警告:

e:\vs 2010 projects\static_cast\static_cast\static_cast.cpp(11): warning C4244: “初始化”: 從“double”轉換到“int”,可能丟失數據

使用static_cast可以明確告訴編譯器,這種損失精度的轉換是在知情的情況下進行的,也可以讓閱讀程序的其它程序員明確你是有意識的轉換而不是由于疏忽。

把精度大的類型轉換為精度小的類型,static使用位截斷進行處理。

2、使用static_cast可以找回存放在void*指針中的值。

double a = 1.999;
void * vptr = & a;
double * dptr = static_cast<double*>(vptr);
cout<<*dptr<<endl;//輸出1.999

3、static_cast也可以用在基類與派生類指針或引用類型之間的轉換。然而它不做運行時的檢查,不如dynamic_cast安全。static_cast僅僅是依靠類型轉換語句中提供的信息來進行轉換,而dynamic_cast則會遍歷整個類繼承體系進行類型檢查,因此dynamic_cast在執行效率上會比static_cast要差一些。

現在我們有父類與其派生類如下:

class ANIMAL
{
public:ANIMAL():_type("ANIMAL"){};virtual void OutPutname(){cout<<"ANIMAL";};
private:string _type ;
};
class DOG:public ANIMAL
{
public:DOG():_name("大黃"),_type("DOG"){};void OutPutname(){cout<<_name;};void OutPuttype(){cout<<_type;};
private:string _name ;string _type ;
};

此時我們進行派生類與基類類型指針的轉換:注意從下向上(子類到基類)的轉換是安全的,從上向下(基類到子類)的轉換不一定安全。

int main()
{//基類指針轉為派生類指針,且該基類指針指向基類對象。ANIMAL * ani1 = new ANIMAL ;DOG * dog1 = static_cast<DOG*>(ani1);//dog1->OutPuttype();//錯誤,在ANIMAL類型指針不能調用方法OutPutType();在運行時出現錯誤。//基類指針轉為派生類指針,且該基類指針指向派生類對象ANIMAL * ani3 = new DOG;DOG* dog3 = static_cast<DOG*>(ani3);dog3->OutPutname(); //正確//
    system("pause");}

?

從上邊對static_cast分析可以看出,static_cast跟傳統轉換方式幾乎是一致的,所以只要將static_cast和圓括號去掉,再將尖括號改成圓括號就變成了傳統的顯式轉換方式。

?

轉自:

http://www.cnblogs.com/ider/archive/2011/07/31/cpp_cast_operator_part4.html

http://www.cnblogs.com/QG-whz/p/4509710.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257294.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257294.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257294.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MySQL Binlog Mixed模式記錄成Row格式

背景&#xff1a; 一個簡單的主從結構&#xff0c;主的binlog format是Mixed模式&#xff0c;在執行一條簡單的導入語句時&#xff0c;通過mysqlbinlog導出發現記錄的Binlog全部變成了Row的格式&#xff08;明明設置的是Mixed&#xff09;&#xff0c;現在就說說在什么情況下Bi…

update語句中使用子查詢

55. 更改 108 員工的信息: 使其工資變為所在部門中的最高工資, job 變為公司中平均工資最低的 job 1). 搭建骨架 update employees set salary (), job_id () where employee_id 108; 2). 所在部門中的最高工資 select max(salary) from employees where department_id ( s…

html后臺數據分類管理,細分數據.html

&#xfeff;細分數據$axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; };$axure.utils.getOtherPath function() { return resources/Other.html; };$axure.utils.getReloadPath function() { return resources/reload.html; };…

SpringBoot的配置文件加載順序和使用方式

1、bootstrap.properties bootstrap.properties 配置文件是由“根”上下文優先加載&#xff0c;程序啟動之初就感知 如&#xff1a;Spring Cloud Config指定遠程配置中心地址&#xff0c;就要在這個文件中指定。這樣才能在啟動之初發現遠程配置中心&#xff0c;并從遠程獲取配置…

Get請求

寫在前面的話 XMLHttpRequest對象的open方法的第一個參數為request-type,取值可以為get或post.本篇介紹get請求. get請求的目的,主要是為了獲取數據.雖然get請求可以傳遞數據,但傳遞數據的目的是為了告訴服務器,給我們什么內容. 使用get請求時,參數都是隨url進行傳遞的. 使用ge…

css3中的BFC,IFC,GFC和FFC(轉載)

作者原文網址&#xff1a;http://www.cnblogs.com/dingyufenglian/p/4845477.html What‘s FC&#xff1f; 一定不是KFC&#xff0c;FC的全稱是&#xff1a;Formatting Contexts&#xff0c;是W3C CSS2.1規范中的一個概念。它是頁面中的一塊渲染區域&#xff0c;并且有一套渲染…

javaweb學習總結——Filter高級開發

在filter中可以得到代表用戶請求和響應的request、response對象&#xff0c;因此在編程中可以使用Decorator(裝飾器)模式對request、response對象進行包裝&#xff0c;再把包裝對象傳給目標資源&#xff0c;從而實現一些特殊需求。 一、Decorator設計模式 1.1、Decorator設計模…

html期末網頁設計,求網頁設計的期末作業一份 HTML的

1&#xff0e; 課程設計建議主題方向&#xff1a;電子商務類網站、門戶類網站、專題類網站。整體要求&#xff1a;主題鮮明、健康&#xff1b;風格自然、內容充實、完整&#xff1b;布局合理&#xff0c;配色和諧。(5分)2&#xff0e; 網站至少包括15張頁面(包括首頁)&#x…

Android(java)學習筆記10:同步中的死鎖問題以及線程通信問題

1. 同步弊端&#xff1a; &#xff08;1&#xff09;效率低 &#xff08;2&#xff09;如果出現了同步嵌套&#xff0c;就容易產生死鎖問題 死鎖問題及其代碼 &#xff1a; &#xff08;1&#xff09;是指兩個或者兩個以上的線程在執行的過程中&#xff0c;因爭奪資源產生的一種…

4源代碼的下載和編譯

1、Android移植主要就是Linux內核移植&#xff0c;而Linux內核移植主要是Linux驅動移植&#xff0c;為了開發和測試Linux驅動&#xff0c;要在Ubuntu下搭建兩套開發環境&#xff1a;Android應用程序開發環境和Linux內核開發環境&#xff1b; 2、Android源代碼包括&#xff1a;內…

在html中三個圖片切換,輕松搞定網頁中的圖片切換

生活中經常看到&#xff0c;像新浪等很多門戶網站的首頁都有滾動圖片的展示&#xff0c;如下圖所示&#xff1a;某網站首頁滾動切換圖片這樣不但可以減少文字的單一、乏味&#xff0c;而且可以直觀內容&#xff0c;更好的吸引用戶。那在我們做軟件系統時&#xff0c;是否也可以…

python 進程編程速成

python具有thread多線程庫&#xff0c;但多線程并不是真正的多線程&#xff0c;不能充分利用多核CPU資源。 在大多數情況下&#xff0c;python可以使用multiprocessing多進程庫&#xff0c;可以輕松完成從單進程到并發執行的轉換。 multiprocessing庫支持子進程、通信和共享數據…

requirejs(shim)處理加載非AMD規范的js庫

使用requirejs加載模塊&#xff0c;模塊的定義得遵守AMD規范&#xff0c;也即定義模塊的時候使用如下函數定義模塊: 1 define(function(){ 2 var private function(){ 3 console.log(私有方法...); 4 }; 5 return { 6 public:funct…

關于常用meta的總結

入行也半年了&#xff0c;無數次的想過寫博客也無數次的想過第一篇會寫什么&#xff0c;一直沒有落實。今天心血來潮把博客開了&#xff0c;那就寫點東西吧。第一篇就寫一寫看似簡單但又經常不注意到的meta標簽吧。&#xff08;博主經驗尚淺&#xff0c;有許多理解不到位的地方…

計算機應用基礎18春在線作業1答案,東師計算機應用基礎-18春在線作業1.docx

東師計算機應用基礎18春在線作業11、A 2、C 3、C 4、C 5、B一、單選題共25題&#xff0c;62.5分1、國際區位、全拼雙音、五筆字型和自然碼是不同種類的漢字A外碼B內碼C字型碼D交換碼正確答案是&#xff1a;A2、漢字字形碼的使用是在____A輸入時B內部傳送時C輸出時D兩臺計算機之…

jQuery Validate 驗證,校驗規則寫在控件中的具體例子

將校驗規則寫到控件中 <script src"../js/jquery.js" type"text/javascript"></script> <script src"../js/jquery.validate.js" type"text/javascript"></script> <script src"./js/jquery.metadata…

在oracle中使用Trigger

1、初始目標 在對表h1插入一條數據時&#xff0c;同時插入一條重復的數據&#xff08;只有主鍵不同&#xff09; 2、在PL/SQL里New一個Trigger或者手動敲入代碼 先說明一下&#xff0c;表h1包括4列ID、C1、C2、C3 create or replace trigger Trigger_Testafter insert on h1for…

html突出顯示,javascript-記住html頁面中突出顯示的文本(向html頁面添加注釋)

我有一個HTML文件,我正在用webkit打開它,我想開發一個應用程序,這樣,在打開它之后,我應該能夠選擇一些文本并將其突出顯示(例如,按下“ highlight text”按鈕).并且它應該記住突出顯示的文本,以便下次打開時應自動突出顯示相同的文本…要存儲哪些信息,以便下次可以突出顯示相同…

cygwin

根據cygwin user guide翻譯整理&#xff0c;希望對大家有所幫助。有錯誤清指出。 1 引言 cygwin是一個在windows平臺上運行的unix模擬環境&#xff0c;是cygnus solutions公司開發的自由軟件&#xff08;該公司開發了很多好東西&#xff0c;著名的還有eCos&#xff0c;不…

JAVA wait(), notify(),sleep具體解釋

在CSDN開了博客后&#xff0c;一直也沒在上面公布過文章&#xff0c;直到前一段時間與一位前輩的對話&#xff0c;才發現技術博客的重要&#xff0c;立志要把CSDN的博客建好。但一直沒有找到好的開篇的主題&#xff0c;今天再看JAVA線程相互排斥、同步的時候又有了新的體會&…