定義一個類,本質上是定義一個數據類型的藍圖。這實際上並無定義任何數據,但它定義了類的名稱意味着什麼,也就是說,它定義了類的對象包括了什麼,以及能夠在這個對象上執行哪些操做。html
類定義格式以下:ios
class Box { public: //在類對象做用域內,公共成員在類的外部是可訪問的。 double length; // 盒子的長度 double breadth; // 盒子的寬度 double height; // 盒子的高度 };
聲明類對象:c++
Box Box1; // 聲明 Box1,類型爲 Box Box Box2; // 聲明 Box2,類型爲 Box
訪問數據成員:函數
#include <iostream> using namespace std; class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 }; int main( ) { Box Box1; // 聲明 Box1,類型爲 Box Box Box2; // 聲明 Box2,類型爲 Box double volume = 0.0; // 用於存儲體積 // box 1 詳述 Box1.height = 5.0; //爲實例的某個屬性賦值,採用點號 Box1.length = 6.0; Box1.breadth = 7.0; // box 2 詳述 Box2.height = 10.0; Box2.length = 12.0; Box2.breadth = 13.0; // box 1 的體積 volume = Box1.height * Box1.length * Box1.breadth; //訪問某個實例的類中的某個屬性,一樣用點號,固然還要看共有仍是私有 cout << "Box1 的體積:" << volume <<endl; // box 2 的體積 volume = Box2.height * Box2.length * Box2.breadth; cout << "Box2 的體積:" << volume <<endl; return 0; }
定義類成員函數:spa
內部定義成員函數:指針
class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 double getVolume(void) { return length * breadth * height; } };
外部定義成員函數,必需要使用範圍解析運算符:code
double Box::getVolume(void) //類名::函數名 { return length * breadth * height; }
在外部定義內聯的成員函數,那麼你須要一個關鍵字:inlinehtm
class A { public:void Foo(int x, int y) { } // 自動地成爲內聯函數 } // 頭文件 class A { public: void Foo(int x, int y); } // 定義文件,這個也是內聯函數,注意inline必須與函數定義放在一塊 inline void A::Foo(int x, int y){}
調用成員函數:對象
#include <iostream> using namespace std; class Box { public: double length; // 長度 double breadth; // 寬度 double height; // 高度 // 成員函數聲明 double getVolume(void); void setLength( double len ); void setBreadth( double bre ); void setHeight( double hei ); }; // 成員函數定義 double Box::getVolume(void) { return length * breadth * height; } void Box::setLength( double len ) { length = len; } void Box::setBreadth( double bre ) { breadth = bre; } void Box::setHeight( double hei ) { height = hei; } // 程序的主函數 int main( ) { Box Box1; // 聲明 Box1,類型爲 Box Box Box2; // 聲明 Box2,類型爲 Box double volume = 0.0; // 用於存儲體積 // box 1 詳述 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // box 2 詳述 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // box 1 的體積 volume = Box1.getVolume(); cout << "Box1 的體積:" << volume <<endl; // box 2 的體積 volume = Box2.getVolume(); cout << "Box2 的體積:" << volume <<endl; return 0; }
class Base { public: // 公有成員, protected: // 受保護成員 private: // 私有成員 };
public:blog
#include <iostream> using namespace std; class Line { public: double length; void setLength( double len ); //聲明成員函數 double getLength( void ); }; // 成員函數定義 double Line::getLength(void) //外部實現成員函數 { return length ; } void Line::setLength( double len ) { length = len; } // 程序的主函數 int main( ) { Line line; // 設置長度 line.setLength(6.0); //public支持使用類自帶的成員函數修改屬性值 cout << "Length of line : " << line.getLength() <<endl; //public一樣支持在外部直接賦值類的屬性 line.length = 10.0; // OK: 由於 length 是公有的 cout << "Length of line : " << line.length <<endl; return 0; }
private:
#include <iostream> using namespace std; class Box { public: double length; void setWidth( double wid ); double getWidth( void ); private: double width; }; // 成員函數定義,成員函數屬於公有,可是操做的是私有的屬性 double Box::getWidth(void) { return width ; } void Box::setWidth( double wid ) { width = wid; } // 程序的主函數 int main( ) { Box box; // 對於私有變量width來講,不使用成員函數設置寬度是不行的 // box.width = 10.0; // Error: 由於 width 是私有的 box.setWidth(10.0); // 只能使用成員函數設置寬度,也就是說私有的屬性只有經過它本身定義的方法才能改變,外部不能改變它。 cout << "Width of box : " << box.getWidth() <<endl; return 0; }
protected:只有本身或者子類的成員函數才能訪問
#include <iostream> using namespace std; class Box { protected: double width; }; class SmallBox:Box // SmallBox 是派生類 { public: void setSmallWidth( double wid ); double getSmallWidth( void ); }; // 子類的成員函數 double SmallBox::getSmallWidth(void) { return width ; } void SmallBox::setSmallWidth( double wid ) { width = wid; } // 程序的主函數 int main( ) { SmallBox box; // 使用成員函數設置寬度 box.setSmallWidth(5.0); cout << "Width of box : "<< box.getSmallWidth() << endl; return 0; }
1.private 成員只能被本類成員(類內)和友元訪問,不能被派生類訪問;
2.protected 成員能夠被派生類訪問。
構造函數:
c++中構造函數的名稱與類的名稱是徹底相同的,而且不會返回任何類型,也不會返回 void。構造函數可用於爲某些成員變量設置初始值。
#include <iostream> using namespace std; class Line { public: void setLength( double len ); double getLength( void ); Line(); // 這是構造函數,構造函數裏帶參數也是能夠的,就和普通函數帶參數同樣 private: double length; }; // 成員函數定義,包括構造函數 Line::Line(void) //定義構造函數,在class裏直接定義也行。 { cout << "Object is being created" << endl; } void Line::setLength( double len ) { length = len; } double Line::getLength( void ) { return length; } // 程序的主函數 int main( ) { Line line; //一旦實例化就會跑構造函數 // 設置長度 line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl; return 0; }
構造函數能夠用特殊的格式來初始化類內的某些屬性:
Line::Line( double len): length(len) { cout << "Object is being created, length = " << len << endl; } //和下面的代碼效果同樣: Line::Line( double len) { cout << "Object is being created, length = " << len << endl; length = len; } //假設有一個類 C,具備多個字段 X、Y、Z 等須要進行初始化,同時初始化多個屬性 C::C( double a, double b, double c): X(a), Y(b), Z(c) { .... }
析構函數:
類的析構函數是類的一種特殊的成員函數,它會在每次刪除所建立的對象時執行。
析構函數的名稱與類的名稱是徹底相同的,只是在前面加了個波浪號(~)做爲前綴,它不會返回任何值,也不能帶有任何參數。析構函數有助於在跳出程序(好比關閉文件、釋放內存等)前釋放資源。
#include <iostream> using namespace std; class Line { public: void setLength( double len ); double getLength( void ); Line(); // 這是構造函數聲明 ~Line(); // 這是析構函數聲明 private: double length; }; // 成員函數定義,包括構造函數 Line::Line(void) { cout << "Object is being created" << endl; } Line::~Line(void) { cout << "Object is being deleted" << endl; } void Line::setLength( double len ) { length = len; } double Line::getLength( void ) { return length; } // 程序的主函數 int main( ) { Line line; // 設置長度 line.setLength(6.0); cout << "Length of line : " << line.getLength() <<endl; //line.~Line(); 這樣也是能夠滴,手動析構之後系統仍是會再檢查一遍 return 0; }
其實就是拷貝一個對象的實例,儘管聽起來簡單,可是拷貝的時候必定要注意指針或者引用等,當心語法錯誤
#include <iostream> //拷貝構造函數 using namespace std; class Line { public: int getLength( void ); Line( int len ); // 簡單的構造函數 Line( const Line &obj); // 拷貝構造函數 ~Line(); // 析構函數 private: int *ptr; }; // 在對象的外部定義函數內容,成員函數定義,包括構造函數 Line::Line(int len) { cout << "調用構造函數" << endl; // 爲指針分配內存 ptr = new int; //新建一個int數據類型 *ptr = len; } Line::Line(const Line &obj) //指明瞭要拷貝的是line這個對象,由於這個對象已經被構造過了 { cout << "調用拷貝構造函數併爲指針 ptr 分配內存" << endl; ptr = new int; *ptr = *obj.ptr; //爲啥是指針呢,由於ptr是個指針,至關於*(obj.ptr) } Line::~Line(void) { cout << "釋放內存" << endl; delete ptr; } int Line::getLength( void ) { return *ptr; } void display(Line obj) { cout << "line 大小 : " << obj.getLength() <<endl; } // 程序的主函數 int main( ) { Line line(10); display(line); return 0; }
返回:
調用構造函數 調用拷貝構造函數併爲指針 ptr 分配內存 line 大小 : 10 釋放內存 釋放內存
//函數聲明等一致的狀況下,拷貝構造函數也能夠是直接複製實例 //接上一個函數 // 程序的主函數 int main( ) { Line line1(10); Line line2 = line1; // 這裏也調用了拷貝構造函數 display(line1); display(line2); return 0; }
返回是這樣的:
調用構造函數 調用拷貝構造函數併爲指針 ptr 分配內存 調用拷貝構造函數併爲指針 ptr 分配內存 line 大小 : 10 釋放內存 調用拷貝構造函數併爲指針 ptr 分配內存 line 大小 : 10 釋放內存 釋放內存 釋放內存
友元函數不是類的成員函數,而是定義在類的外部,可是又能訪問私有和保護成員的函數,友元函數用friend指定。
class Box { double width; public: double length; friend void printWidth( Box box ); void setWidth( double wid ); };
#include <iostream> using namespace std; class Box { double width; public: friend void printWidth( Box box ); //注意此處的友元函數傳遞的參數是類實例哦。 void setWidth( double wid ); }; // 成員函數定義 void Box::setWidth( double wid ) { width = wid; } // 請注意:printWidth() 不是任何類的成員函數 void printWidth( Box box ) { /* 由於 printWidth() 是 Box 的友元,它能夠直接訪問該類的任何成員 */ cout << "Width of box : " << box.width <<endl; } // 程序的主函數 int main( ) { Box box; // 使用成員函數設置寬度 box.setWidth(10.0); // 使用友元函數輸出寬度 printWidth( box ); return 0; }