青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 181  文章 - 15  trackbacks - 0
<2006年8月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

在閱讀類型轉(zhuǎn)換之前,還是先看一下關(guān)鍵字explicit(顯式)
書上的例子中的類名叫做Stack,這樣總感覺有些誤解,因為棧這個概念已經(jīng)在我們的腦海中先入為主了,容易形成思維定式.那么我寫一個和其他任何概念都無關(guān)的例子:
class MyClass
{    
    
private:
    
int _number;
    
public:
    MyClass(
int number)
    {
        _number
=number;
    }
};
上面的類很普通,沒什么特別的.我們可以這樣創(chuàng)建這個類的對象:
int main()
{
    MyClass instance
=5;
}
這就比較有意思了,c++還能這樣寫,我以前的確沒有見過.那么explicit關(guān)鍵字的作用就是不讓你這樣寫,如果你這樣寫了,編譯器就會給你一個錯誤提示.現(xiàn)在改造一下MyClass
class MyClass
{    
    
private:
    
int _number;
    
public:
    
explicit MyClass(int number)
    {
        _number
=number;
    }
};
main函數(shù)不變的情況下,編譯器會這樣提示你:
Explicit.cpp: In function ‘int main()’:
Explicit.cpp:14: 錯誤: conversion from ‘int’ to non-scalar type ‘MyClass’ requested
這樣,就只能這樣寫了:
MyClass instance(5);
好了,下面開始閱讀類型轉(zhuǎn)換的部分.
1 static_cast
這個操作符的執(zhí)行過程可以被認為是:它創(chuàng)建了一個新的對象,然后用要轉(zhuǎn)換的值去初始化這個新對象.這個轉(zhuǎn)換只有當一個類型轉(zhuǎn)換被聲明過才能執(zhí)行.
首先是一個簡單的例子:
//一個簡單的類型轉(zhuǎn)換
   int valueToBeConverted=int();
   
using namespace std;
   cout
<<static_cast<float>(valueToBeConverted)<<"\n";
很像其他語言中的顯式類型轉(zhuǎn)換.那么對于我自己的類如何進行轉(zhuǎn)換呢?可以看一下下面的這個例子:
#include <iostream>

class MyClass2
{
   
public:
    
int IntMember1;
   MyClass2()
   {
      IntMember1
=1;
   }
};
class MyClass1
{
   
public:
   
int IntMember1;
   
virtual void  f()
   {
       std::cout
<<IntMember1<<"\n";
   }
   
explicit MyClass1(MyClass2 instance)
   {
       IntMember1
=instance.IntMember1;
   }
};
int main()
{
   MyClass2 mc2Instance;
   MyClass1 mc1Instance
=static_cast<MyClass1>(mc2Instance);
   mc1Instance.f();
}
注意看上面的粗體字explicit.如果沒有explict對于構(gòu)造函數(shù)的修飾,那么萬全可以簡單爽快的這么寫:
MyClass1 mc1Instance=mc2Instance;
換句話說,如果你想讓別人寫代碼的時候不關(guān)心類型,舒舒服服的寫出你認為不安全的代碼,那么你就去掉explicit,如果你想讓別人在寫代碼的時候,讓那些不安全的類型轉(zhuǎn)換變得更加"顯眼"一些,那么你就按上面這樣寫.然后讓編譯器狠狠的給他們一個警告.
2 dynamic_cast
This operator enables you to downcast a polymorphic type to its real static type. This is
the only cast that is checked at runtime. Thus, you could also use it to check the type of a
polymorphic value.

這個運算符能夠讓你把一個多態(tài)的類型轉(zhuǎn)換成它的真實的靜態(tài)類型.這是唯一的在運行時進行檢驗的轉(zhuǎn)換方法.所以你同樣需要在轉(zhuǎn)換之前檢驗多態(tài)值的類型.
首先dynamic_cast只能夠用于指針或者引用.否則編譯器會告訴你類似這樣的錯誤:
 無法將 ‘scInstance’ 從類型 ‘SubClass’ 動態(tài)轉(zhuǎn)換到類型 ‘class BaseClass’ (target is not pointer or reference)
這里使用書中的例子:
 
class Car;         // 至少擁有一個抽象函數(shù)的抽象類
   class Cabriolet : public Car {
       
   };
   
class Limousine : public Car {
       
   };
   
void f(Car* cp)
   {
       Cabriolet
* p = dynamic_cast<Cabriolet*>(cp);
       
if (p == NULL) {
           
//p并非Cabriollet類型
           
       }
   }

In this example, f() contains a special behavior for objects that have the real static type
Cabriolet. When the argument is a reference and the type conversion fails,
dynamic_cast throws a bad_cast exception (bad_cast is described on page 26).
Note that from a design point of view, it it always better to avoid such type-dependent
statements when you program with polymorphic types.
當參數(shù)是一個引用并且類型轉(zhuǎn)換失敗的時候,dynamic_cast會拋出一個bad_cast異常.值得注意的是,從設(shè)計的角度來說,通常在進行多態(tài)類型的程序編寫時,應(yīng)該避免這樣的類型依賴.
3 const_cast
This operator adds or removes the constness of a type. In addition, you can remove a
volatile qualification. Any other change of the type is not allowed.
這個操作符添加或除去一個類型的常量化(特性).另外,你可以除去一個變量變化的能力.任何對于這個類型變量的變化都將不被允許.
讓常量可修改的例子:
class MyClass
{
    
public:
        
int MemberValue;
        
void showValue()
        {
            cout
<<"My Value is"<<MemberValue<<"\n";
        }
        MyClass()
        {
            MemberValue
=1;
        }    
};
int main()
{
    
const MyClass myValue;
    MyClass 
*ptr=const_cast<MyClass*>(&myValue);
    ptr
->MemberValue=100;
    ptr
->showValue();
}
上面的例子只是將一個const變得可以修改了,但是注意到書中的這樣一句:
In addition, you can remove a
volatile qualification. Any other change of the type is not allowed.
似乎還可以將一個可變量轉(zhuǎn)換為非可變的,這里沒有查到相關(guān)資料,也許書的后面會有相應(yīng)解釋,所以這里先放一放.
4 reinterpret_cast
這個比較有趣,支持不兼容類型之間的轉(zhuǎn)換.以下是例子:
#include <iostream>
using namespace std;
class ClassA
{
    
public:
    
int Value1;
    
int Value2;
    
int Value3;
    
void showValue()
    {
        cout
<<Value1<<","<<Value2<<","<<Value3<<"\n";
    }
};
class ClassB
{
    
public:
    
int Value1;
    
int Value2;
    
int Value3;
    ClassB()
    {
        Value1
=1;
        Value2
=2;
        Value3
=3;
    }
};
int main()
{
    ClassB 
*b=new ClassB();
    ClassA 
*a=reinterpret_cast<ClassA*>(b);
    a
->showValue();
}
同樣,這種轉(zhuǎn)換對于非基本類型來說,仍然只能支持指針和引用.
這些運算符的優(yōu)點就是他們明確了類型轉(zhuǎn)換的意圖,并且能夠讓編譯器獲取更多的信息來了解這些類型轉(zhuǎn)換的原因,然后當這些轉(zhuǎn)換操作越過他們的職能的時候,編譯器會報告錯誤.
另外需要注意的是,這些類型轉(zhuǎn)換都只能接受一個參數(shù).看下面的例子:
    static_cast<Fraction>(15,100)                   
上面不會產(chǎn)生你想要的結(jié)果.這里的逗號并不是用來連接兩個參數(shù)的,而是作為逗號運算符出現(xiàn),這里15會被舍棄,而采用100作為參數(shù)構(gòu)造Fraction.
所以還是需要采用下面的方法才合適:
    Fraction(15,100)                             





posted on 2007-06-17 14:56 littlegai 閱讀(267) 評論(0)  編輯 收藏 引用 所屬分類: 我的讀書筆記
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩高清| 亚洲深夜激情| 欧美日韩在线视频一区| 久久综合给合久久狠狠狠97色69| 亚洲一区二区三区成人在线视频精品 | 欧美一级成年大片在线观看| 亚洲免费伊人电影在线观看av| 欧美一二三区精品| 久久综合中文字幕| 欧美激情欧美狂野欧美精品| 欧美日韩在线播放三区四区| 国产精品久久久久aaaa| 黑人巨大精品欧美黑白配亚洲| 激情成人av| 99伊人成综合| 久久久99久久精品女同性| 欧美成人午夜激情视频| 亚洲神马久久| 牛牛影视久久网| 国产伦精品一区二区三区免费迷| 亚洲第一精品福利| 亚洲综合视频一区| 欧美大片免费| 欧美一区二区三区视频| 欧美精品在线观看播放| 国产综合色在线| 在线亚洲欧美视频| 欧美成人一区二区三区在线观看| 中文在线资源观看网站视频免费不卡 | 欧美小视频在线| 国产专区欧美专区| 亚洲午夜在线视频| 欧美国产日韩一区二区在线观看 | 亚洲午夜国产成人av电影男同| 欧美中文字幕在线| 欧美日韩综合一区| 亚洲乱码一区二区| 欧美/亚洲一区| 欧美影院一区| 国产精品人成在线观看免费| 亚洲高清在线| 久久国产黑丝| 亚洲一区二区三区久久| 欧美精品久久99久久在免费线| 国产一区在线视频| 欧美一区二区日韩一区二区| 亚洲国产精品一区二区久| 亚洲男人天堂2024| 国产精品久久久久久久久久妞妞| 91久久精品网| 欧美黑人一区二区三区| 久久久久久久久久久久久女国产乱| 国产伦精品一区二区三区视频孕妇| 一区二区三区免费看| 亚洲黄色免费| 欧美激情日韩| 99精品久久久| 亚洲乱码精品一二三四区日韩在线| 久久综合给合| 亚洲精品免费网站| 亚洲激情一区二区| 欧美日本免费| 中文高清一区| 亚洲小视频在线观看| 国产精品推荐精品| 久久久久免费| 老牛影视一区二区三区| 91久久精品美女高潮| 欧美肥婆bbw| 欧美日本一道本| 亚洲欧美在线免费观看| 亚洲一区中文字幕在线观看| 国产欧美日韩一区二区三区在线| 久久精品国产亚洲一区二区三区| 欧美一区二区三区久久精品| 极品av少妇一区二区| 欧美激情视频一区二区三区免费| 欧美精品粉嫩高潮一区二区| 亚洲一区二区免费| 欧美在线视频观看免费网站| 亚洲国产精品久久久久秋霞影院| 亚洲精品免费一区二区三区| 欧美午夜一区二区三区免费大片| 亚洲精品久久在线| 国产一区二区电影在线观看 | 亚洲欧美中日韩| 欧美影院在线| 亚洲精品中文字幕有码专区| 一本久道久久综合狠狠爱| 国产伦精品一区二区三区免费迷| 免费在线国产精品| 欧美日韩精品在线播放| 久久久国际精品| 欧美精品综合| 久久久久综合| 欧美色大人视频| 美女爽到呻吟久久久久| 欧美特黄一区| 亚洲第一福利在线观看| 国产目拍亚洲精品99久久精品 | 久久国产欧美精品| 欧美精品大片| 免费成人av| 国产精品一区二区久久久久| 欧美成人首页| 国产自产女人91一区在线观看| 亚洲国产精品999| 韩国免费一区| 亚洲伊人一本大道中文字幕| 亚洲三级观看| 另类天堂av| 久久伊伊香蕉| 国产日产亚洲精品系列| 一本色道久久综合狠狠躁篇的优点| 在线日韩视频| 久久久蜜桃精品| 久久久久一本一区二区青青蜜月| 国产精品黄色在线观看| 亚洲人成网站777色婷婷| 在线日韩日本国产亚洲| 欧美自拍偷拍午夜视频| 欧美一区二区三区日韩| 国产精品久久久久久久免费软件| 亚洲人成艺术| 日韩视频免费在线| 欧美国产日韩一区二区| 欧美激情中文不卡| 91久久在线观看| 美女图片一区二区| 欧美成人黄色小视频| 一区二区三区我不卡| 久久狠狠久久综合桃花| 久久久美女艺术照精彩视频福利播放| 国产精品青草综合久久久久99| 夜久久久久久| 亚洲男同1069视频| 国产精品视频内| 午夜精品国产更新| 久久久精品欧美丰满| 狠狠色丁香久久婷婷综合丁香| 欧美资源在线| 欧美高清视频在线播放| 亚洲精品国精品久久99热| 欧美激情日韩| 中国成人黄色视屏| 久久精品30| 亚洲国产一区二区在线| 亚洲国产精品久久人人爱蜜臀 | 久久久久一本一区二区青青蜜月| 国产毛片一区| 久久婷婷丁香| 亚洲精品日韩在线| 亚洲免费一在线| 国产欧美短视频| 久久久精彩视频| 亚洲激情视频在线| 亚洲欧美日韩成人| 国色天香一区二区| 欧美大片在线观看| 中文日韩在线视频| 久久精品国产精品亚洲精品| 在线观看日韩一区| 欧美日韩国产精品| 亚洲嫩草精品久久| 亚洲电影在线免费观看| 亚洲一区二区欧美| 国产一区二区三区在线观看精品 | 亚洲美洲欧洲综合国产一区| 午夜精品短视频| 伊人久久亚洲影院| 欧美国产视频在线观看| 亚洲综合日本| 亚洲黄色免费| 久久精品国产一区二区三区| 亚洲欧洲日产国码二区| 国产精品视频999| 欧美成人免费一级人片100| 亚洲一区免费观看| 欧美国产视频日韩| 欧美一站二站| 一区二区三区回区在观看免费视频| 国产美女扒开尿口久久久| 欧美激情第9页| 久久精品伊人| 亚洲免费在线观看| 亚洲日韩欧美视频| 男女激情视频一区| 久久成人亚洲| 亚洲综合首页| 日韩亚洲欧美一区| 永久555www成人免费| 国产精品日本一区二区| 欧美国产综合一区二区| 久久久久国色av免费看影院| 中文亚洲视频在线| 日韩午夜三级在线| 91久久精品网| 亚洲高清在线观看| 欧美成人精品一区二区| 久久这里有精品视频|