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

隨筆 - 181  文章 - 15  trackbacks - 0
<2007年7月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

My Tech blog

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

在閱讀類型轉換之前,還是先看一下關鍵字explicit(顯式)
書上的例子中的類名叫做Stack,這樣總感覺有些誤解,因為棧這個概念已經在我們的腦海中先入為主了,容易形成思維定式.那么我寫一個和其他任何概念都無關的例子:
class MyClass
{    
    
private:
    
int _number;
    
public:
    MyClass(
int number)
    {
        _number
=number;
    }
};
上面的類很普通,沒什么特別的.我們可以這樣創建這個類的對象:
int main()
{
    MyClass instance
=5;
}
這就比較有意思了,c++還能這樣寫,我以前的確沒有見過.那么explicit關鍵字的作用就是不讓你這樣寫,如果你這樣寫了,編譯器就會給你一個錯誤提示.現在改造一下MyClass
class MyClass
{    
    
private:
    
int _number;
    
public:
    
explicit MyClass(int number)
    {
        _number
=number;
    }
};
main函數不變的情況下,編譯器會這樣提示你:
Explicit.cpp: In function ‘int main()’:
Explicit.cpp:14: 錯誤: conversion from ‘int’ to non-scalar type ‘MyClass’ requested
這樣,就只能這樣寫了:
MyClass instance(5);
好了,下面開始閱讀類型轉換的部分.
1 static_cast
這個操作符的執行過程可以被認為是:它創建了一個新的對象,然后用要轉換的值去初始化這個新對象.這個轉換只有當一個類型轉換被聲明過才能執行.
首先是一個簡單的例子:
//一個簡單的類型轉換
   int valueToBeConverted=int();
   
using namespace std;
   cout
<<static_cast<float>(valueToBeConverted)<<"\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對于構造函數的修飾,那么萬全可以簡單爽快的這么寫:
MyClass1 mc1Instance=mc2Instance;
換句話說,如果你想讓別人寫代碼的時候不關心類型,舒舒服服的寫出你認為不安全的代碼,那么你就去掉explicit,如果你想讓別人在寫代碼的時候,讓那些不安全的類型轉換變得更加"顯眼"一些,那么你就按上面這樣寫.然后讓編譯器狠狠的給他們一個警告.
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.

這個運算符能夠讓你把一個多態的類型轉換成它的真實的靜態類型.這是唯一的在運行時進行檢驗的轉換方法.所以你同樣需要在轉換之前檢驗多態值的類型.
首先dynamic_cast只能夠用于指針或者引用.否則編譯器會告訴你類似這樣的錯誤:
 無法將 ‘scInstance’ 從類型 ‘SubClass’ 動態轉換到類型 ‘class BaseClass’ (target is not pointer or reference)
這里使用書中的例子:
 
class Car;         // 至少擁有一個抽象函數的抽象類
   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.
當參數是一個引用并且類型轉換失敗的時候,dynamic_cast會拋出一個bad_cast異常.值得注意的是,從設計的角度來說,通常在進行多態類型的程序編寫時,應該避免這樣的類型依賴.
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.
似乎還可以將一個可變量轉換為非可變的,這里沒有查到相關資料,也許書的后面會有相應解釋,所以這里先放一放.
4 reinterpret_cast
這個比較有趣,支持不兼容類型之間的轉換.以下是例子:
#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();
}
同樣,這種轉換對于非基本類型來說,仍然只能支持指針和引用.
這些運算符的優點就是他們明確了類型轉換的意圖,并且能夠讓編譯器獲取更多的信息來了解這些類型轉換的原因,然后當這些轉換操作越過他們的職能的時候,編譯器會報告錯誤.
另外需要注意的是,這些類型轉換都只能接受一個參數.看下面的例子:
    static_cast<Fraction>(15,100)                   
上面不會產生你想要的結果.這里的逗號并不是用來連接兩個參數的,而是作為逗號運算符出現,這里15會被舍棄,而采用100作為參數構造Fraction.
所以還是需要采用下面的方法才合適:
    Fraction(15,100)                             





posted on 2007-06-17 14:56 littlegai 閱讀(273) 評論(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>
            久久一二三区| 久久久精品一区二区三区| 男人的天堂亚洲| 亚洲欧美卡通另类91av| 日韩视频一区二区在线观看| 美女成人午夜| 另类欧美日韩国产在线| 午夜精品影院| 欧美一区二区三区婷婷月色| 亚洲欧美资源在线| 久久精品中文字幕免费mv| 欧美一区二区私人影院日本| 一区二区三区久久久| 亚洲天堂网在线观看| 亚洲乱码国产乱码精品精| 久久精品论坛| 一区二区三区在线视频播放| 欧美日韩高清在线播放| 欧美高清在线一区| 久久久久久久久久久成人| 亚洲欧美日韩天堂| 老司机精品福利视频| 欧美激情国产日韩| 日韩亚洲一区二区| 麻豆国产va免费精品高清在线| 免费视频久久| 国产欧美日韩不卡| 9l视频自拍蝌蚪9l视频成人| 久久成人精品视频| 久久久久久综合| 欧美老女人xx| 亚洲二区精品| 久久精品中文字幕一区| 91久久国产综合久久| 一本大道久久a久久综合婷婷| 性做久久久久久| 国产精品国色综合久久| 亚洲精品欧美日韩专区| 久久亚洲一区二区三区四区| 日韩特黄影片| 欧美网站在线| 亚洲免费在线观看视频| 亚洲精品一区久久久久久| 久久久久久九九九九| 国产情人综合久久777777| 亚洲精品一区久久久久久| 亚洲日韩第九十九页| 欧美阿v一级看视频| 激情伊人五月天久久综合| 欧美91福利在线观看| 男女视频一区二区| 一区二区三区四区五区精品视频 | 久久久久久久综合日本| 国产欧美在线视频| 久久久国产亚洲精品| 久久这里有精品15一区二区三区| 激情久久五月天| 日韩视频免费观看高清完整版| 欧美乱在线观看| 欧美精品一区在线播放| 最新高清无码专区| 国产精品视频yy9099| 欧美91大片| 国产精品一区免费视频| 久久中文字幕一区| 国产精品久久久久9999| 久久久综合网| 国产欧美日韩中文字幕在线| 亚洲精品免费在线| 免费成人av在线| 国产精品系列在线播放| 91久久黄色| 91久久香蕉国产日韩欧美9色 | 一区二区三区在线视频观看 | 韩日成人在线| 亚洲网站在线观看| 99亚洲一区二区| 欧美va亚洲va日韩∨a综合色| 欧美一级免费视频| 欧美日韩视频在线一区二区| 亚洲人成网站在线观看播放| 在线精品亚洲| 麻豆精品精华液| 欧美一区网站| 久久精品30| 国产欧美亚洲视频| 亚洲肉体裸体xxxx137| 国产精品一区二区三区久久久| 亚洲精品久久久久久久久久久| 亚洲日本成人| 国产精品美女主播| 亚洲欧美一区二区原创| 欧美金8天国| 欧美一区综合| 一区二区三区波多野结衣在线观看| 国产精品久久久久久久久| 99成人精品| 亚洲精品一区二区三区福利| 日韩一级黄色大片| 性感少妇一区| 久久人人看视频| 亚洲人成亚洲人成在线观看| 亚洲自拍偷拍视频| 欧美激情久久久| 国产视频在线观看一区二区三区 | 免费久久99精品国产自| 欧美日本不卡视频| 国产在线播放一区二区三区| 亚洲人成在线观看网站高清| 久久电影一区| 一本色道精品久久一区二区三区| 欧美伊人久久大香线蕉综合69| 欧美激情中文字幕在线| 国内精品久久久久久久影视蜜臀| 亚洲精品一二区| 欧美肥婆在线| 久久福利电影| 欧美大片va欧美在线播放| 欧美成人午夜免费视在线看片| 国产精品毛片在线| 亚洲一区二区黄色| 亚洲精品网址在线观看| 免费在线观看成人av| 国产精品一区二区久久精品| 在线观看一区视频| 蜜臀a∨国产成人精品| 久久精品官网| 黄色精品免费| 欧美肥婆在线| 欧美成人午夜剧场免费观看| 亚洲电影自拍| 国内精品国产成人| 欧美激情国产日韩精品一区18| 久久亚洲视频| aa日韩免费精品视频一| 亚洲三级影片| 国产精品啊v在线| 久久久午夜电影| 久久久www成人免费毛片麻豆| 国内精品久久久久影院 日本资源| 久久精品欧美日韩精品| 免费人成精品欧美精品| 日韩视频精品在线观看| 亚洲综合电影| 亚洲精品九九| 午夜亚洲福利在线老司机| 激情偷拍久久| 亚洲性视频网址| 日韩视频国产视频| 久久久久久久综合| 亚洲欧美中文另类| 欧美电影在线观看完整版| 亚洲在线观看视频网站| 欧美ed2k| 欧美11—12娇小xxxx| 国产亚洲欧洲997久久综合| 亚洲欧洲一区二区三区| 国产欧美精品在线播放| 日韩一级免费观看| 日韩五码在线| 欧美激情久久久| 亚洲国产高潮在线观看| 雨宫琴音一区二区在线| 久久综合狠狠| 欧美第一黄网免费网站| 国产综合香蕉五月婷在线| 日韩一级裸体免费视频| 亚洲三级视频| a4yy欧美一区二区三区| 91久久视频| 模特精品裸拍一区| 亚洲女人天堂av| 欧美日韩大片一区二区三区| 久久综合伊人77777| 韩国精品一区二区三区| 蜜桃久久av一区| 亚洲欧洲视频在线| 一区二区三区久久久| 亚洲日本久久| 中文av一区特黄| 国产欧美日韩精品专区| 久久精彩视频| 亚洲日本成人女熟在线观看| 香蕉成人啪国产精品视频综合网| 国产精品一二一区| 欧美大片一区二区| 亚洲资源在线观看| 欧美国产三区| 久久久综合激的五月天| 亚洲一区二区三区四区五区黄 | 性伦欧美刺激片在线观看| 久久久噜噜噜久噜久久| 日韩视频二区| 在线高清一区| 国产精品电影在线观看| 乱码第一页成人| 亚洲一区欧美二区| 亚洲精品国产精品国产自| 欧美肥婆在线| 欧美va日韩va|