14C 類的型別轉換

2021-04-14 19:59:03 字數 3959 閱讀 4723

.類的型別轉換

(前言,定義,基類與派生類,設計指導)

1.前言

內建型別(int,double,float,char,bool)的轉換

1.1內建型別隱式轉換

因為內建型別有轉換功能,自然類,派生類也會引入轉換功能,

我們先看一下內建型別轉換

.在賦值時,編譯器始終以=的左運算元型別為標準進行轉換

int i1=25,i5;

double d1=5.65;

i2=i1+d1;

//因左運算元是int,d1的double自然轉換為int,被簡化為5

結果i2=30

.在表示式計算時,編譯器通常以最大的數值最大的為標準進行轉換

char->int->float->double

bool v;

v=i1>=d1;

//因為是在表示式中,int自動轉換為double參與比較運算

.指標轉換為bool

int *pi;

if(*pi);

//自動轉換為bool型別

while(*pi)

//自動轉換為bool型別

.int與bool轉換

bool b=true;

int iv1=b;

//bool自動轉換為int,iv1=0

double d1=3.12

bool a=d1;

//double自動轉換為1,非0即true,結果bool=true

1.2c++原來老的轉換方式

它存在的理由是為了支援舊的c++向後相容而支援的語法

type (express)

(type)express //如float f1=(float)d1+float(int1);

1.3命名的強制轉換c++新引入的特性

cast-name(expression).

.dynamic_cast(用於繼承和執行時的指標和引用的動態識別)

.const_cast(把const物件轉換為非const,讓它可以修改)

const char* pstr;

char* p1=string_copy(const_case(pstr));

.static_cast(去掉隱式轉換的編譯器警告)

當編譯器將乙個較大的算術型別賦值給較小的型別時,編譯器通常會警告,說會發生精度丟失,

用static_cast後,就會關閉編譯器的精度丟失警告!

double d=69.36;

char ch=static_cast(d);

.reinterpret_cast

這個用的非常少,不同的編譯器有不同的規定,必須查閱相關編譯器的手冊說明

2.定義

在內建型別,基類,派生類自然都存在轉換運算

型別轉換共有以下幾個形式

1.內建資料型別的隱式轉換

(小型別到大型別轉換,精度不影響,由大型別到小型別轉換,精度會減少,)

2.內建資料型別的顯示轉換(表示式前面新增轉換型別符號)

3.c++引入的4個強制型別轉換()

4.類的型別轉換

3.基類與派生類

3.1類的型別轉換

類的轉換操作符是一種特別的類成員函式,在類體宣告並實現,

格式如 class classid};

**如class **allint

//型別轉換成員函式

private:

int int_a};

特別說明:型別轉換成員函式不能有返回值,不能有形參

3.2類的幾種轉換型別

.在表示式中: **allint **1;double d1; **1>d1;//**1類物件轉換為double

.在條件中:if (**1) //自動由int轉換為bool

.在函式中:**allint s1; char c1=get(s1) //從函式返回值由int轉換為char

.在cout中:cout<.在cin中:cin>>s1; //把s1轉換為istream流物件,這類中就是過載》

.傳統強制轉換: double d1=(double)s1; //把類的物件s1強制轉換為double

.新型強制轉換:float f1=static_cast(s1); //把s1物件強制轉換為float

3.2基類和派生類之間的轉換

3.2.1.基類到派生類的轉換

從基類到派生類的自動轉換方式是不行的,包括指標,如果要用就得使用dynamic_cast指定

因為派生類裡新新增的成員,基類未必有

//class base;

//class subbase :public base;

base base1;

subbase sub1=base1; //error,嚴重錯誤,派生類會有部分成員未初始化,函式訪問出錯

.當基類有虛函式,派生類實現了基類的虛函式時,可以用dynamic_cast轉換符號

把基類的指標強制轉換成派生類的指標,**如下:

subclass *sub=dynamic_cast(baseptr)

//把基類指標baseptr強制轉換為派生類指標subclass*,並賦值給派生類的指標*sub

if (subclass *sub=dynamic_cast(baseptr))

…操作派生類的**

else

..操作基類的**

***注意

在使用基類到派生類的強制轉換時,兩個類的資料成員最好相同,派生類資料成員是直接繼承基類的

3.2.1.派生類到基類的轉換

用派生類到到基類的轉換只有兩種方式(引用和複製)

1複製:在基類可以用複製建構函式和=運算子把派生類直接

class derived;

class base;

derived d1;

base b1(d1);

//ok,用派生類直接生成基類的物件b1,呼叫基類的複製建構函式

base b2=d1;

//ok,建立基類物件b2,用派生類d1初始化b2,呼叫基類的=函式

以上這種做法非常少用

2.派生類到基類的引用

2.1.在派生類直接使用基類函式,防止派生類同名函式覆蓋基類函式

class derived;

base *b1=& derived; //用派生類生成基類物件

double d=b1->base::get_amount(25);//直接使用基類::基類虛方法

2.2通過在派生類直接使用基類的引用或者指標來呼叫基類或者派生類的方法

如果基類有虛函式成員,派生類實現了基類的虛函式

class base

print(const base&);

protected:

int qty;

double price;

};class derived :public base

private:

int minqty;

double rate;

};呼叫這兩個類的其它函式,它不是基類和派生類的任何成員函式

下面這個函式是用上面的兩個類組合成另外通用函式

void print (ostream os&,const base & b1)

//類函式呼叫**,這就是把動態繫結呼叫,編譯器在執行程式後,

才能確定呼叫的引數是在基類還是派生類,不同的類的物件自動呼叫不同類的對應函式

base base1;

derived derived1;

print (cout,derived1); //呼叫派生類的get_amout

print (cout,base1);

//呼叫基類的get_amout

5.設計指導

.不要過分的對類進行型別轉換

.乙個類只支援乙個型別轉換

.從基類的到派生類的是不會自動轉換!

.當基類是有虛函式,在派生類的虛函式的是對基類的引用時,

在程式執行後,才能知道應該呼叫是基類還是派生類的成員函式,這個轉換大家一定要搞清楚

14 C 基礎 陣列

陣列宣告形如 a d 其中大小必須大於 0 const unsigned sz 10 常量表示式 int arr sz 含有 10 個整數的陣列 int parr 10 含有 10 個整數的陣列初始化 陣列 int main cout value a 0 endl value 0 return 0 ...

14 C語言 陣列

c 語言支援陣列資料結構,它可以儲存乙個固定大小的相同型別元素的順序集合。陣列是用來儲存一系列資料,但它往往被認為是一系列相同型別的變數。陣列的宣告並不是宣告乙個個單獨的變數,比如 number0 number1 number99,而是宣告乙個陣列變數,比如 numbers,然後使用 numbers...

1 4 C 語言基礎 陣列

type arrayname 宣告乙個int陣列 int arry 宣告的時候指定陣列的長度為5 這個時候的初始化值為0 int arry2 new int 5 宣告的時候初始化值 初始化的值個數必須和指定的長度匹配 int array3 new int 5 字串陣列 string arrstr 陣...