標籤:c++ class
C++的class和其他的進階語言如C#/Java有些不一樣。這是C++物件導向的核心。
一點一點來: 650) this.width=650;" src="http://img.baidu.com/hi/jx2/j_0003.gif" alt="j_0003.gif" />
一 , 建立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沒被初始化之前是沒有空間分配的,當然其所有的成員也是沒有空間的。
650) this.width=650;" title="01.png" src="https://s4.51cto.com/wyfs02/M01/93/00/wKiom1kGvNvigCO0AABTLoiNczo027.png-wh_500x0-wm_3-wmp_4-s_4219424639.png" alt="wKiom1kGvNvigCO0AABTLoiNczo027.png-wh_50" />
②:關於存取修飾詞在C++中有3中 private , protected , public
1, 在class中預設為private , 在struct中預設為public
2, class中,存取修飾詞可以有多個, 其作用範圍為 : 其位置到下一個存取修飾詞的位置(如果沒有下一個存取修飾詞則是到class結束位置既是 “}”),如:
650) this.width=650;" title="02.png" src="https://s5.51cto.com/wyfs02/M01/93/00/wKiom1kGvqXh6qZYAABJbxy0ars486.png-wh_500x0-wm_3-wmp_4-s_3516390608.png" alt="wKiom1kGvqXh6qZYAABJbxy0ars486.png-wh_50" />
③: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;}
其結果如:
650) this.width=650;" title="03.png" src="https://s4.51cto.com/wyfs02/M01/92/FE/wKioL1kGv-yTUiiWAAAhdy1ofYg039.png-wh_500x0-wm_3-wmp_4-s_1302667787.png" alt="wKioL1kGv-yTUiiWAAAhdy1ofYg039.png-wh_50" />
到目前我們會發現一個很基礎的問題 , 成員的初始化(如果等待調用者自己一個一個用代碼實現初始化的話 ,很有可能會漏掉),當然在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的聲明的順序:
650) this.width=650;" title="04.png" src="https://s5.51cto.com/wyfs02/M01/92/FF/wKioL1kGxVfSe3KXAAAewHrzgKs427.png-wh_500x0-wm_3-wmp_4-s_2910155521.png" alt="wKioL1kGxVfSe3KXAAAewHrzgKs427.png-wh_50" />
和在建構函式中:後面寫的順序無關:
如下面的寫法,就不會得到預期的值:
#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;}
結果為:
650) this.width=650;" title="05.png" src="https://s1.51cto.com/wyfs02/M00/93/01/wKiom1kGxqDwtiB5AAAjER78PoY087.png-wh_500x0-wm_3-wmp_4-s_183381991.png" alt="wKiom1kGxqDwtiB5AAAjER78PoY087.png-wh_50" />
因為賦值的順序是先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;}
運行結果 :
650) this.width=650;" title="06.png" src="https://s5.51cto.com/wyfs02/M00/93/01/wKiom1kGyNaQxU_6AAAZF40F5lY784.png-wh_500x0-wm_3-wmp_4-s_3099186131.png" alt="wKiom1kGyNaQxU_6AAAZF40F5lY784.png-wh_50" />
當然 , 這種只是示範(實際開發中不這麼搞) 。 實際開發中 , 將聲明寫在都檔案中 , 將實現寫在源檔案中:
定義一個標頭檔:
650) this.width=650;" title="07.png" src="https://s4.51cto.com/wyfs02/M01/93/01/wKiom1kGzYaiMt0zAABQKG2tbZo187.png-wh_500x0-wm_3-wmp_4-s_3148953672.png" alt="wKiom1kGzYaiMt0zAABQKG2tbZo187.png-wh_50" />
實現:
#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;}
結果:
650) this.width=650;" title="08.png" src="https://s5.51cto.com/wyfs02/M01/92/FF/wKioL1kGzc2TvgQHAAAkISJxnWI673.png-wh_500x0-wm_3-wmp_4-s_1568922101.png" alt="wKioL1kGzc2TvgQHAAAkISJxnWI673.png-wh_50" />
本文出自 “Better_Power_Wisdom” 部落格,請務必保留此出處http://aonaufly.blog.51cto.com/3554853/1920946
C++ class