您好,登錄后才能下訂單哦!
c++類和對象有哪些,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
話不多說,我們直接進入主題:對象:客觀世界里的一切事物都可以看作是一個對象,每一個對象應當具有屬性(靜態特征,比如一個班級,一個專業,一個教室)和行為(動態特征,例如:學習,開會,體育比賽等)兩個要素。 對象是由一組屬性和一組行為構成的。類(class):就是對象的類型,代表了某一批對象的共同特性和特征。類是對象的抽象,而對象是類的具體實例。
2.1 類的引入
在C語言中我們定義一個結構體是這樣定義的:
struct Student{ int _age; char* _Gender; char* _Name;};int main(){ struct S; return 0;}
我們都知道,在C中,“數據”和“處理數據的操作(函數)”是分開的,語言本身并沒有支持“數據和函數”之間的關聯性。那么,如果我們要在某種特定情況下讓數據和函數有一定的關聯,這個時候我們應該怎么處理呢?先看一個例子:
很明顯,編譯器報錯了,還很多。也就是說在C語言當中是不允許在結構體中定義函數的,那么在C++中是不是也是這樣呢?
通過對比,我們明顯的發現C++是可以做到我們想要將數據和函數產生一定關系的操作的。為了區別C語言中結構體的定義struct,在C++中我們常用class來代替struct。
2.2 類的定義
#include <iostream>using namespace std;class Student{public: char* _name;private: char* _Gender; int _age;};int main(){ class S; return 0;}
class是C++中定義類的關鍵字,Student為類的名字,{}中為類的主體,和結構體類似,在{}后面跟的是;。類中的元素稱為類的成員,類中的數據稱為類的屬性或者類的成員變量,類中的函數稱為類的成員函數。
類的定義通常有兩種方式:
1、將類的聲明和定義都放在類體中za2、將類的聲明放在.h頭文件中,定義放在.cpp文件中
在代碼中我們看到了private 和 public兩個沒有見過的東西,接下來我們講一講C++的三大特性:繼承 封裝 多態封裝:隱藏對象的屬性和現實細節,僅對外公開接口和對象進行交互,將數據和操作數據的方法有機結合。
這里的public 和 private是C++中的訪問限定符,訪問限定符有三個:public (公有) protected(保護) private(私有)。在下面的博文中我們會用到這些限定符,具體情況后續文章再作介紹,這里讀者只需了解就可。
這里做一些說明:
1、public成員在類外可以直接訪問2、protected和private成員在類外不能夠直接訪問,在這里我們簡單的把他們看成一樣的。(二者區別就是基類private成員在派生類中是不能被訪問的,如果基類成員不想再類外被訪問,但需要在派生類中能訪問,就定義為protected,后面博文更到派生類時我們會再來把這兩個東西拿出來再講一講)3、他們的作用域從該訪問限定符出現的位置開始直到下一個訪問限定符出現截止4、class的默認訪問權限是private,而struct默認訪問權限是public(因為struct要兼容C的特點)
那么我們如何在類外訪問一個類中的私有成員變量呢?(面試題)
方法一:在類中添加一個共有的方法
我們可以看到在public中定義的公有函數可以在類外訪問私有成員變量,這是訪問的一種方法。
類的作用域
在C語言階段我們知道變量的作用域只有局部域和全局域兩種,而在C++作用域則分為了局部域、全局域、命名空間域和類域四種,前面幾種域相信我們都已將熟悉過,這里我講一下類域。
類定義了一個新的作用域,類的所有成員都必須處在類的作用域中。形參表和函數體處于類的作用域中。在類體外定義成員,需要用 :: 作用域解析符指明成員屬于哪一個類域。在類的作用域外,只能通過對象(或指針)借助成員訪問操作符 . 和->來訪問類成員,跟在訪問操作符后面的名字必須在相關聯的類的作用域中。
下面我們看看在代碼中如何實現上述的意思:
#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; //存在歧義,是變量給變量賦值呢還是形參給變量賦值,或者變量給形參賦值呢?同學們不要這樣寫 //實際證明,這里的賦值是形參給形參賦值,結果并沒有改變變量的值,結果出了函數作用域自然是一個隨機值 正確寫法: **_a = a;** } void PrintA() { cout << a << endl; //cout << _a <<endl; }private: int a; //類域 正確寫法:int _a;};int main(){ int a = 40; //局部域 Test t; t.SetA(30); cout << N1::a << endl; //打印命名空間域的值 cout << ::a << endl; //打印全局域的值 cout << a << endl; //打印局部域的值 t.PrintA(); //打印類域的值 return 0;}
看完這串代碼不知道各位有沒有什么疑惑呢?這里附上這段代碼的結果:
我們本應該想讓編譯器給我們打印出10 20 30 40這幾個值,結果最后卻給了我們一個亂碼,這是為什么呢?細心的同學應該發現了,在這里我們定義的所有的變量都是用的同一個名稱a,這樣的編碼習慣是極不好的,容易引起誤會,上面就給了一個反例。
在使用一個變量時,我們應當注意必須要先聲明后使用
2.2 類的對象的模型
類對象模型:類中各成員在內存中的布局形式。下面我們以代碼形式舉例說明一下:
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;}
既然一個類有那么多成員和不同的對象,那么它到底是怎么來存儲的呢?
下面給出三種假設:
假設一
假設二:
那就剩最后一種假設了:
顯然。這種假設才是成立的。
提一個問題:C++是怎么計算一個類的大小的?
我們在程序中驗證一下:
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;}
可以看到在有成員變量的時候得到的值是4,而一個空類和只有成員函數的時候它的值是1,難道是成員函數的大小?顯然是不對的,前面我們說過,成員函數是不占大小的,因此我們可以得出結論:一個類的大小,實際上就是該類中非靜態成員變量之和,當然也要注意內存對齊,空類大小值為一(在Linux和VS下面是 1)為什么是一呢?就是為了區分不同的對象,設計 1 是為了 節省空間
關于c++類和對象有哪些問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。