話(huà)不多說(shuō),我們直接進(jìn)入主題:
對(duì)象:客觀(guān)世界里的一切事物都可以看作是一個(gè)對(duì)象,每一個(gè)對(duì)象應(yīng)當(dāng)具有屬性(靜態(tài)特征,比如一個(gè)班級(jí),一個(gè)專(zhuān)業(yè),一個(gè)教室)和行為(動(dòng)態(tài)特征,例如:學(xué)習(xí),開(kāi)會(huì),體育比賽等)兩個(gè)要素。 對(duì)象是由一組屬性和一組行為構(gòu)成的。
類(lèi)(class):就是對(duì)象的類(lèi)型,代表了某一批對(duì)象的共同特性和特征。類(lèi)是對(duì)象的抽象,而對(duì)象是類(lèi)的具體實(shí)例。
創(chuàng)新互聯(lián)公司專(zhuān)注于企業(yè)營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、網(wǎng)站重做改版、賓川網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性?xún)r(jià)比高,為賓川等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
2.1 類(lèi)的引入
在C語(yǔ)言中我們定義一個(gè)結(jié)構(gòu)體是這樣定義的:
struct Student { int _age; char* _Gender; char* _Name; }; int main() { struct S; return 0; }
我們都知道,在C中,“數(shù)據(jù)”和“處理數(shù)據(jù)的操作(函數(shù))”是分開(kāi)的,語(yǔ)言本身并沒(méi)有支持“數(shù)據(jù)和函數(shù)”之間的關(guān)聯(lián)性。那么,如果我們要在某種特定情況下讓數(shù)據(jù)和函數(shù)有一定的關(guān)聯(lián),這個(gè)時(shí)候我們應(yīng)該怎么處理呢?
先看一個(gè)例子:
很明顯,編譯器報(bào)錯(cuò)了,還很多。也就是說(shuō)在C語(yǔ)言當(dāng)中是不允許在結(jié)構(gòu)體中定義函數(shù)的,那么在C++中是不是也是這樣呢?
通過(guò)對(duì)比,我們明顯的發(fā)現(xiàn)C++是可以做到我們想要將數(shù)據(jù)和函數(shù)產(chǎn)生一定關(guān)系的操作的。
為了區(qū)別C語(yǔ)言中結(jié)構(gòu)體的定義struct,在C++中我們常用class來(lái)代替struct。
2.2 類(lèi)的定義
#include <iostream> using namespace std; class Student { public: char* _name; private: char* _Gender; int _age; }; int main() { class S; return 0; }
class是C++中定義類(lèi)的關(guān)鍵字,Student為類(lèi)的名字,{}中為類(lèi)的主體,和結(jié)構(gòu)體類(lèi)似,在{}后面跟的是;。類(lèi)中的元素稱(chēng)為類(lèi)的成員,類(lèi)中的數(shù)據(jù)稱(chēng)為類(lèi)的屬性或者類(lèi)的成員變量,類(lèi)中的函數(shù)稱(chēng)為類(lèi)的成員函數(shù)。
類(lèi)的定義通常有兩種方式:
1、將類(lèi)的聲明和定義都放在類(lèi)體中za
2、將類(lèi)的聲明放在.h頭文件中,定義放在.cpp文件中
在代碼中我們看到了private 和 public兩個(gè)沒(méi)有見(jiàn)過(guò)的東西,接下來(lái)我們講一講C++的三大特性:繼承 封裝 多態(tài)
封裝:隱藏對(duì)象的屬性和現(xiàn)實(shí)細(xì)節(jié),僅對(duì)外公開(kāi)接口和對(duì)象進(jìn)行交互,將數(shù)據(jù)和操作數(shù)據(jù)的方法有機(jī)結(jié)合。
這里的public 和 private是C++中的訪(fǎng)問(wèn)限定符,訪(fǎng)問(wèn)限定符有三個(gè):public (公有) protected(保護(hù)) private(私有)。在下面的博文中我們會(huì)用到這些限定符,具體情況后續(xù)文章再作介紹,這里讀者只需了解就可。
這里做一些說(shuō)明:
1、public成員在類(lèi)外可以直接訪(fǎng)問(wèn)
2、protected和private成員在類(lèi)外不能夠直接訪(fǎng)問(wèn),在這里我們簡(jiǎn)單的把他們看成一樣的。(二者區(qū)別就是基類(lèi)private成員在派生類(lèi)中是不能被訪(fǎng)問(wèn)的,如果基類(lèi)成員不想再類(lèi)外被訪(fǎng)問(wèn),但需要在派生類(lèi)中能訪(fǎng)問(wèn),就定義為protected,后面博文更到派生類(lèi)時(shí)我們會(huì)再來(lái)把這兩個(gè)東西拿出來(lái)再講一講)
3、他們的作用域從該訪(fǎng)問(wèn)限定符出現(xiàn)的位置開(kāi)始直到下一個(gè)訪(fǎng)問(wèn)限定符出現(xiàn)截止
4、class的默認(rèn)訪(fǎng)問(wèn)權(quán)限是private,而struct默認(rèn)訪(fǎng)問(wèn)權(quán)限是public(因?yàn)閟truct要兼容C的特點(diǎn))
那么我們?nèi)绾卧陬?lèi)外訪(fǎng)問(wèn)一個(gè)類(lèi)中的私有成員變量呢?(面試題)
方法一:在類(lèi)中添加一個(gè)共有的方法
我們可以看到在public中定義的公有函數(shù)可以在類(lèi)外訪(fǎng)問(wèn)私有成員變量,這是訪(fǎng)問(wèn)的一種方法。
類(lèi)的作用域
在C語(yǔ)言階段我們知道變量的作用域只有局部域和全局域兩種,而在C++作用域則分為了局部域、全局域、命名空間域和類(lèi)域四種,前面幾種域相信我們都已將熟悉過(guò),這里我講一下類(lèi)域。
類(lèi)定義了一個(gè)新的作用域,類(lèi)的所有成員都必須處在類(lèi)的作用域中。形參表和函數(shù)體處于類(lèi)的作用域中。在類(lèi)體外定義成員,需要用 :: 作用域解析符指明成員屬于哪一個(gè)類(lèi)域。在類(lèi)的作用域外,只能通過(guò)對(duì)象(或指針)借助成員訪(fǎng)問(wèn)操作符 . 和->來(lái)訪(fǎng)問(wèn)類(lèi)成員,跟在訪(fǎng)問(wèn)操作符后面的名字必須在相關(guān)聯(lián)的類(lèi)的作用域中。
下面我們看看在代碼中如何實(shí)現(xiàn)上述的意思:
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> using namespace std; namespace N1 //命名空間域 { int a = 10; } int a = 20; //全局域 void FunTest() { cout << "FunTest()" << endl; } class Test { public: void SetA(int a) { a = a; //存在歧義,是變量給變量賦值呢還是形參給變量賦值,或者變量給形參賦值呢?同學(xué)們不要這樣寫(xiě) //實(shí)際證明,這里的賦值是形參給形參賦值,結(jié)果并沒(méi)有改變變量的值,結(jié)果出了函數(shù)作用域自然是一個(gè)隨機(jī)值 正確寫(xiě)法: **_a = a;** } void PrintA() { cout << a << endl; //cout << _a <<endl; } private: int a; //類(lèi)域 正確寫(xiě)法:int _a; }; int main() { int a = 40; //局部域 Test t; t.SetA(30); cout << N1::a << endl; //打印命名空間域的值 cout << ::a << endl; //打印全局域的值 cout << a << endl; //打印局部域的值 t.PrintA(); //打印類(lèi)域的值 return 0; }
看完這串代碼不知道各位有沒(méi)有什么疑惑呢?
這里附上這段代碼的結(jié)果:
我們本應(yīng)該想讓編譯器給我們打印出10 20 30 40這幾個(gè)值,結(jié)果最后卻給了我們一個(gè)亂碼,這是為什么呢?
細(xì)心的同學(xué)應(yīng)該發(fā)現(xiàn)了,在這里我們定義的所有的變量都是用的同一個(gè)名稱(chēng)a,這樣的編碼習(xí)慣是極不好的,容易引起誤會(huì),上面就給了一個(gè)反例。
在使用一個(gè)變量時(shí),我們應(yīng)當(dāng)注意必須要先聲明后使用
2.2 類(lèi)的對(duì)象的模型
類(lèi)對(duì)象模型:類(lèi)中各成員在內(nèi)存中的布局形式。
下面我們以代碼形式舉例說(shuō)明一下:
class Student { public: void SetStudentInfo(char* name, char* gender, int age) { strcpy(_name, name); strcpy(_gender, gender); _age = age; } void PrintInfo() { cout << _name << " " << _gender << " " << _age << endl; } private: char _name[20]; char _gender[3]; int _age; }; int main() { Student s1, s2; cout << sizeof(s1) << endl; s1.SetStudentInfo("鳴人", "男", 14); s2.SetStudentInfo("佐助", "男", 14); return 0; }
既然一個(gè)類(lèi)有那么多成員和不同的對(duì)象,那么它到底是怎么來(lái)存儲(chǔ)的呢?
下面給出三種假設(shè):
假設(shè)一
假設(shè)二:
那就剩最后一種假設(shè)了:
顯然。這種假設(shè)才是成立的。
提一個(gè)問(wèn)題:C++是怎么計(jì)算一個(gè)類(lèi)的大小的?
我們?cè)诔绦蛑序?yàn)證一下:
class A1 { public: void f1() {} void f2() {} }; class A2 { public: void f1() {} private: int a = 10; }; class A3 {}; int main() { cout << sizeof(A1) << endl; //1 cout << sizeof(A2) << endl; //4 cout << sizeof(A3) << endl; //1 return 0; }
可以看到在有成員變量的時(shí)候得到的值是4,而一個(gè)空類(lèi)和只有成員函數(shù)的時(shí)候它的值是1,難道是成員函數(shù)的大???
顯然是不對(duì)的,前面我們說(shuō)過(guò),成員函數(shù)是不占大小的,因此我們可以得出結(jié)論:一個(gè)類(lèi)的大小,實(shí)際上就是該類(lèi)中非靜態(tài)成員變量之和,當(dāng)然也要注意內(nèi)存對(duì)齊,空類(lèi)大小值為一(在Linux和VS下面是 1)
為什么是一呢?
就是為了區(qū)分不同的對(duì)象,設(shè)計(jì) 1 是為了 節(jié)省空間
文章名稱(chēng):c++類(lèi)和對(duì)象總結(jié)
新聞來(lái)源:http://bm7419.com/article46/gejphg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開(kāi)發(fā)、搜索引擎優(yōu)化、商城網(wǎng)站、定制網(wǎng)站、網(wǎng)站收錄、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)