c++的語法省容,我準(zhǔn)備要結(jié)束了抖拴,c++東西還有很多,比如多線程蓉冈,c11新特性等城舞,我不是很熟,以后有時間在補(bǔ)充吧寞酿。準(zhǔn)備寫c#了家夺,原本準(zhǔn)備開始java語法的,但是看到簡書上面好多是有關(guān)java的文章伐弹,寫的都很不錯(至少我感覺寫不出更好的了)拉馋,決定換一個方向,語法是通用的惨好,但是還是有些不同之處煌茴,c#的.net平臺,好歹是能和j2ee對立的日川,怎么能沒有人介紹了蔓腐。
知識點綜述:
RTTI機(jī)制:
通過運行時類型識別,程序通過使用基類的指針或者引
用來檢查這些指針或引用所指向?qū)ο蟮膶嶋H類型龄句。
操作符:
dynamic_cast
1.0 將基類的指針或引用安全的轉(zhuǎn)換為其它派生類的指針或引用回论。
2.0 注意dynamic_cast轉(zhuǎn)換符只能用于含有虛函數(shù)的類,
其表達(dá)式為dynamic_cast<類型>(表達(dá)式)分歇。
3.0 如果dynamic_cast轉(zhuǎn)換指針類型失敗傀蓉,則返回0;
如果轉(zhuǎn)換引用類型失敗职抡,則拋出一個bad_cast類型的異常葬燎。
typeid //換回指針或引用所指向的類型
類型轉(zhuǎn)換操作
static_cast,
形式 static_cast<目標(biāo)數(shù)據(jù)類型>(源數(shù)據(jù)類型表達(dá)式)
比如: int a;
static_cast<double>(a);
等價于: (double)a;
const_cast
把const指針變成非const類型指針缚甩。
typeinfo
表達(dá)式類型推斷與獲取,好像是c11新特性
auto:當(dāng)編譯器能夠在一個變量的聲明時候就推斷出它的類型
獲取vector迭代器
以前
vector<double> vec;
vector<double>::iterator ite=vec.iterator();
現(xiàn)在
vector<double> vec;
auto ite=vec.iterator();
c++手冊相關(guān)函數(shù)的介紹:
dynamic_cast.PNG
const_cast.PNG
static_cast.PNG
typeid.PNG
好像看圖更加利于學(xué)習(xí)谱净。
相關(guān)代碼,里面有相關(guān)的注解
#include<iostream>
#include<string>
using namespace std;
class A {
protected:
string name;
public:
A(string name);
virtual void display();
};
A::A(string name) {
this->name = name;
cout << "construct A" << endl;
}
void A::display() {
cout << "my name is" << name << endl;
}
class B:public A
{
public:
B(string name,string n);
void display();
};
B::B(string name, string n):A(n)
{
this->name = name;
cout << "construct B" << endl;
}
void B::display() {
cout << "my name is" << name << endl;
}
int main()
{
/*
B b("B", "A");
A *p0 = &b;
p0->display();
*/
//等效下面的語句
A *p = new B("B","A");
B *pb = dynamic_cast<B*>(p); //轉(zhuǎn)換安全蹄胰。
//dynamic_class 需要多態(tài)
if (pb != NULL)
{
//多態(tài)調(diào)用B繼承A的構(gòu)造函數(shù)
pb->display();
//多態(tài)只有父類的指針指向子類岳遥,或者引用才行。c++中裕寨,java不一樣
}
else
cout << "轉(zhuǎn)換不安全,退出" << endl;
A *pa = new A("A");
B *p2 = dynamic_cast<B*>(pa);
if (p2!=NULL)
{
p2->display();
}
else
cout << "轉(zhuǎn)換不安全,退出" << endl;
cout << "----------------------" << endl;
//typeid判斷數(shù)據(jù)類型
cout<<"\"dflx\" type:"<< typeid("dflx").name() << endl;
cout<<"6 type:" << typeid(6).name() << endl;
//const_cast,消除const屬性
int a = 66;
//b是指針產(chǎn)量宾袜,不能改變
const int *b = &a; //b指向的單元不可改寫捻艳。
*(const_cast<int*>(b)) = 88; //消除const屬性
cout << "a="<<a << endl << "*b=" << *b << endl;
cout << "----------------------" << endl;
//static_cast 強(qiáng)制類型轉(zhuǎn)換符
cout << static_cast<int>(9.999) << endl;
cout << "----------------------" << endl;
//auto 通知編譯器根據(jù)初始化代碼判斷數(shù)據(jù)類型
auto c = 22; //c是int類型。
char ch[] = { 'a','b','c' };
//c為 char類型
for (auto c : ch)
cout << c << " ";
cout << endl;
//decltype,獲取一個表達(dá)式類型庆猫。
system("pause");
return 0;
}
試驗結(jié)果:
construct A
construct B
my name isB
construct A
轉(zhuǎn)換不安全认轨,退出
----------------------
"dflx" type:char const [5]
6 type:int
a=88
*b=88
----------------------
9
----------------------
a b c
十一感冒到現(xiàn)在還沒有好,有時候咳著眼淚都出來了月培,看來還是要加強(qiáng)身體的鍛煉嘁字。
參考文章:
C++中RTTI機(jī)制剖析
C++中四種類型轉(zhuǎn)換方式
比較C++中的4種類型轉(zhuǎn)換方式
C++11 新特性之自動類型推斷和類型獲取