/*
四大類型轉(zhuǎn)換
1扩借,static_cast< int >(100.5) 靜態(tài)數(shù)據(jù)類型之間轉(zhuǎn)化
有類型指針和void* 之間轉(zhuǎn)換
無(wú)名對(duì)象支持轉(zhuǎn)換
2甚脉,const_cast 把常量轉(zhuǎn)換成變量 ,只能用一次
eg:
const date;
const_cast <>(date)
xxx_cast<類型>(數(shù)據(jù))
3卵蛉,reinterpret_cast 最危險(xiǎn)的轉(zhuǎn)換 不同類型指針之間的轉(zhuǎn)換
4闪檬,dynamic_cast 動(dòng)態(tài)類型轉(zhuǎn)換(父類子類之間的轉(zhuǎn)換)
父類向子類轉(zhuǎn)換時(shí)需要把關(guān)惜索。dynamic_cast<子類*>(父類地址)
*/
register int n;//直接將數(shù)據(jù)存在寄存器中派昧,快速的訪問(wèn)變量黔姜。低葫。但是寄存器空間有量
//========================
//========================
include <iostream>
include <string>
using namespace std;
class A{
const int date; //注意是常量
public:
A(int d=4 ): date(d){}
virtual void show() const{
cout << "date = " << date <<endl;
}
void set(int d){
const_cast<int&>(date) = d;
}
};
class B : public A
{
public :
void say()
{
cout << "welcome to Nanyang" <<endl;
}
};
int main()
{
static_cast<A>(100).show(); //======靜態(tài)轉(zhuǎn)換
A obj(200);
obj.show();
obj.set(300);
obj.show();
int n = 1;
typedef unsigned int UI; //重新進(jìn)行數(shù)據(jù)類型定義,1定義一個(gè)&類型的變量碟联,2把變量名改為想起的悲鳴& 3在左邊加typedef何恶,4這樣就給&類型起了新的別名郊霎。
typedef unsigned char UC; //搜別名用法蟹漓,沒(méi)理解 (作用:整型變量在內(nèi)存中放置方法)
UC* p = NULL;
p = reinterpret_cast<UC*>(&n);
for(int i = 0; i < 4 ; i++ )
cout << (int)*p++<<' ';
cout <<endl;//數(shù)據(jù) n = 1泛释,在計(jì)算機(jī)的位置中可能保存位置不同衫哥。圃伶。0001或者1000泻拦,不同計(jì)算機(jī)毙芜,儲(chǔ)存位置都有可能
A oa;
B ob;
B* pb = NULL;
A* pa = &oa;
pb = dynamic_cast<B*>(pa);//warning
cout <<"pb = "<<pb<<endl;
}
//====================================
//====================================
//====================================
//========友元函數(shù)==靜態(tài)成員===============
友元函數(shù):
是什么: 在類內(nèi)部用friend 聲明
怎么用:外面的函數(shù)或者另一個(gè)類,直接訪問(wèn)某個(gè)類私有成員的橋梁
靜態(tài)成員 :static members
凡是所有對(duì)象共用一份數(shù)據(jù)争拐,都需要生命靜態(tài)數(shù)據(jù)成員
所有的同一類對(duì)象腋粥,都是用一份數(shù)據(jù)
靜態(tài)數(shù)據(jù)又稱為類變量(屬于這個(gè)類,被該類全體成員共享)(像全局變量一樣架曹,在所有函數(shù)之外初始化)
class Counter{
static int cnt隘冲;
}
int Counter :: cnt;
int Counter :: cnt = 0音瓷;//靜態(tài)變量初始化
或:
include <iostream>
include <string>
using namespace std;
class A{
int date;
public:
A(int d) :date(d){}
A() :date(0){}
~A(){
cout << "~A()" << endl;
}
void show(){
cout << "DATE = " << date <<endl;
}
//friend A add(A a1, A a2); //友元函數(shù)对嚼。只要是類A成員,都可以訪問(wèn)(A類把B類當(dāng)做友元绳慎,B類不一定是A的友元纵竖,不能繼承)
friend class B;
friend A add(const A& a1,const A& a2); //凡是調(diào)用對(duì)象,且不打算復(fù)制一份值給形參杏愤∶移觯可以用引用。珊楼⊥ㄑ辏可以少調(diào)用構(gòu)造,析構(gòu)函數(shù)(用const + 引用厕宗,是不需要改變數(shù)據(jù)采用画舌,如果需要交換數(shù)據(jù)或改變數(shù)值,則不用const)
};
//=======================================友元類
class B
{
public:
void twice(A a){
a.date *= 2;//指明對(duì)象的來(lái)源 a.date
cout << a.date<<endl;
}
};
//=======================================友元函數(shù)
A add(const A& a1, const A& a2){ //定義一個(gè)A類型的函數(shù),如果沒(méi)有友元函數(shù)的聲明已慢,則不通過(guò)編譯(但是曲聂,如果函數(shù)在類內(nèi)部實(shí)現(xiàn),則可以編譯成功)
int sum = a1.date + a2.date;
return A(sum);
}
class Sb111
{
public:
string name;
static string teacher;
static int room;
Sb111(const string& n):name(n){}
void show(){
cout << "我是 " << name << "佑惠,在 " << room;
cout << "教室聽(tīng) " << teacher << "講課" <<endl;
}
static void newTeacher(const string & t)
{
teacher = t;
}
};
string Sb111 :: teacher = "劉思";
int Sb111 :: room =123;
int main(int argc, char argv[])
{
A a1=8;
A a2 =9;
add(a1,a2).show(); //a1與a2的和朋腋,返回的值也是類A
B ob;
ob.twice(20);
Sb111 s1("張三 ");
s1.show();//靜態(tài)成員
Sb111 :: newTeacher("趙二");
s1.show();
s1.newTeacher("王八");
s1.show();
}