您好,登錄后才能下訂單哦!
C++的class和其他的高級語言如C#/Java有些不一樣。這是C++面向對象的核心。
一點一點來:
一 , 創建class
#include <iostream> using namespace std; class My_First_Class { public: int a; }; int main() { My_First_Class c; c.a = 2; cout << c.a << endl; return 0; }
重點:
①:創建類 , 需要用關鍵字class。
②:class也是一種數據類型,{}外面需要以;來結束。
注意點:
①:int a 不能被初始化 , 原因:class沒被初始化之前是沒有空間分配的,當然其所有的成員也是沒有空間的。
②:關于訪問修飾符在C++中有3中 private , protected , public
1, 在class中默認為private , 在struct中默認為public
2, class中,訪問修飾符可以有多個, 其作用范圍為 : 其位置到下一個訪問修飾符的位置(如果沒有下一個訪問修飾符則是到class結束位置既是 “}”),如下圖:
③:My_First_Class c; 這種初始化是把My_First_Class類對象c放在了棧區。其實可以將其放入堆去,其方案是利用指針。代碼如下:
#include <iostream> using namespace std; class My_First_Class { public: int a; private: int c; }; int main() { //My_First_Class c; //a = 2; My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; return 0; }
其結果如下圖:
到目前我們會發現一個很基礎的問題 , 成員的初始化(如果等待調用者自己一個一個用代碼實現初始化的話 ,很有可能會漏掉),當然在C#/Java等高級語言中 , 這個就不成問題了。
在C++中,提供了構造函數可以提供初始化的
#include <iostream> using namespace std; class My_First_Class { public: int a; My_First_Class() { a = 1; } private: int c; }; int main() { My_First_Class c; cout << c.a << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0; }
注意:
①:構造函數和C#/Java一樣 , name使用class的名稱 , 而且沒有返回值
②:構造函數默認應該放在public之下,不然會報錯。
③:構造函數必須要在需要初始化成員的后面創建,如要初始化a(int) , 必須在int a;的后面創建。
初始化列表:
#include <iostream> using namespace std; class My_First_Class { public: int a; private: int c; public: My_First_Class():a(1),c(2) { } }; int main() { My_First_Class c; cout << c.a << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0; }
注意:
①:My_First_Class():a(1),c(2) 賦值的順序是a , c的聲明的順序:
和在構造函數中:后面寫的順序無關:
如下面的寫法,就不會得到預期的值:
#include <iostream> using namespace std; class My_First_Class { public: int a; int m; My_First_Class():m(2),a(m) { } }; int main() { My_First_Class c; cout << c.a << endl; cout << c.m << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0; }
結果為:
因為賦值的順序是先a后m(a在m前進行了聲明)
當然 , 構造函數也可以是有參的和C#/Java一樣 , 這里就不講了
二:類內聲明 , 類外定義
#include <iostream> using namespace std; class My_First_Class { public: int a; int m; My_First_Class():m(2),a(1) { } int sum(); }; int My_First_Class::sum() { return a + m; } int main() { My_First_Class c; int sum = c.sum(); cout << c.a << endl; cout << sum << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0; }
運行結果 :
當然 , 這種只是演示(實際開發中不這么搞) 。 實際開發中 , 將聲明寫在都文件中 , 將實現寫在源文件中:
定義一個頭文件:
實現:
#include <iostream> using namespace std; #include "HeadOne.h" My_First_Class::My_First_Class() { a = 10; } int main() { My_First_Class c; cout << c.a << endl; /* My_First_Class *c = new My_First_Class; c->a = 3; cout << c->a << endl; delete c; */ return 0; }
結果:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。