1、 C++ 定義了哪些類(lèi)型轉(zhuǎn)換操作符?分別有什么作用?
① 定義了四個(gè)操作符:static_cast,const_cast,dynamic_cast和reinterpret_cast。
② static_cast:可以被用于強(qiáng)制類(lèi)型轉(zhuǎn)換(例如,non-const對(duì)象轉(zhuǎn)換為const對(duì)象,int轉(zhuǎn)換為double,等等),它還可以用于很多這樣的轉(zhuǎn)換的反向轉(zhuǎn)換(例如,void*指針轉(zhuǎn)換為有類(lèi)型指針,基類(lèi)指針轉(zhuǎn)換為派生類(lèi)指針)。但是它不能將一個(gè)const對(duì)象轉(zhuǎn)換為一個(gè)non-const對(duì)象(只有const-cast能做到)。它最接近于C-style的轉(zhuǎn)換。
③const_cast:一般用于強(qiáng)制消除對(duì)象的常量性。它是唯一能做到這一點(diǎn)的C++風(fēng)格的強(qiáng)制類(lèi)型。
④dynamic_cast:主要用于執(zhí)行“安全的向下轉(zhuǎn)型”。也就是說(shuō),要確定一個(gè)對(duì)象是否是一個(gè)繼
承體系中的一個(gè)特定類(lèi)型。它是唯一不能用舊風(fēng)格語(yǔ)法執(zhí)行的強(qiáng)制類(lèi)型轉(zhuǎn)換,也是唯一可能有重大運(yùn)行時(shí)代價(jià)的強(qiáng)制轉(zhuǎn)換。
⑤reinterpret_cast:是特意用于底層的強(qiáng)制轉(zhuǎn)換,導(dǎo)致實(shí)現(xiàn)
依賴(lài)(implementation-dependent)(就是說(shuō),不可移植)的結(jié)果。例如,將一個(gè)指針轉(zhuǎn)型為一個(gè)整數(shù)。這樣
的強(qiáng)制轉(zhuǎn)換在底層代碼以外應(yīng)該極為罕見(jiàn)。
2、 C++ 定義了哪些訪問(wèn)控制關(guān)鍵字?分別有什么作用?
簡(jiǎn)單可以歸為以下兩種描述:
1)一個(gè)類(lèi)友元(包含友元函數(shù)或者友元類(lèi)的成員函數(shù)或者友元類(lèi)的所有成員函數(shù))可以訪問(wèn)該類(lèi)的任何成員(包
括成員變量及成員方法)。
2)除去友元外,private成員只有該類(lèi)自身的成員函數(shù)可
以訪問(wèn),protected成員只有該類(lèi)及其派生類(lèi)的成員函數(shù)可
以訪問(wèn),public成員則該類(lèi)及其派生類(lèi)的成員函數(shù)和
對(duì)象都可以訪問(wèn)。
3、 類(lèi)的繼承方式和區(qū)別?
派生類(lèi)繼承方式的影響
類(lèi)的繼承方式有三種:private、protected、public。
1)private屬性不能被繼承。
2)
使用private繼承,父類(lèi)的protected和public屬性在子類(lèi)中變?yōu)?/span>private;
使用protected繼承,父類(lèi)的protected和public屬性在子類(lèi)中變?yōu)?/span>protected;
使用public繼承,父類(lèi)中的protected和public屬性不發(fā)生改變;
4、 在什么情形下調(diào)用虛函數(shù)不會(huì)有多態(tài)性?為什么?
由
虛函數(shù)實(shí)現(xiàn)的動(dòng)態(tài)多態(tài)性的方法:
1. 在
基類(lèi)用virtual聲明成員函數(shù)為虛函數(shù)。
2. 在
派生類(lèi)中重新定義此函數(shù)。
3. 定
義一個(gè)指向基類(lèi)對(duì)象的指針變量,并使它指向同一類(lèi)族中需要調(diào)用該函數(shù)的對(duì)象。
4. 通
過(guò)該指針變量調(diào)用此虛函數(shù),此時(shí)調(diào)用的就是指針變量指向的對(duì)象的同名函數(shù)。
因
此,總結(jié)如下:
1、基類(lèi)函數(shù)未使用virtual聲明而子類(lèi)中使用virtual關(guān)鍵字聲明時(shí)調(diào)用虛函數(shù)不會(huì)有多態(tài)
性;
2、基類(lèi)使用virtual而子類(lèi)未重新實(shí)現(xiàn)該虛函數(shù)則不會(huì)有多態(tài)
性;
3、 使用子類(lèi)創(chuàng)建的對(duì)象轉(zhuǎn)換成基類(lèi)類(lèi)型調(diào)用
虛函數(shù)不會(huì)有多態(tài)性;
5. 構(gòu)造函數(shù)調(diào)用順序。
class Y {...}
class
X : public Y {...}
X one;
構(gòu)造函數(shù)的調(diào)用順序是下面的順序:
Y();
// 基類(lèi)的構(gòu)造函數(shù)
X(); // 繼承類(lèi)的構(gòu)造函數(shù)
對(duì)于多基類(lèi)的情況,下面是一個(gè)例子:
class X :
public Y, public Z
X one;
構(gòu)造函數(shù)以聲明的次序調(diào)用。
Y();
// 基類(lèi)構(gòu)造函數(shù)首先被調(diào)用
Z();
X();
虛基類(lèi)的構(gòu)造函數(shù)在任何非虛基類(lèi)構(gòu)造函
數(shù)前調(diào)用。如果構(gòu)造中包括多個(gè)虛基類(lèi),它們的調(diào)用順序以聲明順序?yàn)闇?zhǔn)。..
如果虛類(lèi)是由非虛類(lèi)派生而來(lái),那非虛類(lèi)
的構(gòu)造函數(shù)要先被調(diào)用。下面是一個(gè)例子:
class X :
public Y, virtual public Z
X one;
調(diào)用順序如下:
Z(); // 虛基類(lèi)初始化
Y(); // 非虛基類(lèi)
X(); // 繼承類(lèi)
下面是一個(gè)復(fù)雜的例子:
class base;
class
base2;
class level1 : public base2, virtual public base;
class
level2 : public base2, virtual public base;
class toplevel : public
level1, virtual public level2;
toplevel view;
構(gòu)造函數(shù)調(diào)用順序如下:
base();
// 虛基類(lèi)僅被構(gòu)造一次
base2();
level2();
// 虛基類(lèi)
base2();
level1();
toplevel();
如果類(lèi)繼承中包括多個(gè)虛基類(lèi)的實(shí)例,基類(lèi)只被初始化一次。
1、如果類(lèi)里面有成員類(lèi),成員類(lèi)的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2、創(chuàng)建派生類(lèi)的對(duì)象,基類(lèi)的構(gòu)造函數(shù)函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派
生類(lèi)里的成員類(lèi));
3、 基類(lèi)構(gòu)造函數(shù)如果有多個(gè)基類(lèi)則構(gòu)造函數(shù)的調(diào)用順序是某類(lèi)在類(lèi)派生表
中出現(xiàn)的順序而不是它們?cè)诔蓡T初始化表中的順序;
4、成員類(lèi)對(duì)象構(gòu)造函數(shù)如果有多個(gè)成員類(lèi)對(duì)象則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類(lèi)中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5、派生類(lèi)構(gòu)造函數(shù)
作為一般規(guī)則派生類(lèi)構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類(lèi)數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕?lèi)構(gòu)造函數(shù)否則兩
個(gè)類(lèi)的實(shí)現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴(kuò)展基類(lèi)的實(shí)現(xiàn)。(基類(lèi)設(shè)計(jì)者的責(zé)任是提供一組適當(dāng)?shù)幕?lèi)構(gòu)造函數(shù))
6. RTTI是什么,怎么實(shí)現(xiàn)的?舉個(gè)例子。
RTTI即運(yùn)行時(shí)類(lèi)型識(shí)別,通過(guò)它程序能夠使用
基類(lèi)的指針或引用來(lái)檢查這些指針或引用所指的對(duì)象的實(shí)際派生類(lèi)型。
RTTI提供了一下兩個(gè)非常有用的操作符:
1、typeid操作符,返回指針和引用所指的實(shí)際類(lèi)型
2、dynamic_cast操作符,將基類(lèi)類(lèi)型的指針或引用
安全地轉(zhuǎn)換為派生類(lèi)型的指針或引用。from:
http://www.shnenglu.com/changshoumeng/archive/2010/07/21/120992.html
posted on 2010-07-23 17:15
chatler 閱讀(237)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
C++_BASIS