C++ 面向對象html
c++建立對象的時候若是使用new運算符,將會返回返回一個指針,指向堆中的內存地址
定義一個類,用來描述一個盒子java
#include <iostream> using namespace std; class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 }; int main(){ return 0; }
public 代表這是一個公共的成員。class定義一個類ios
#include <iostream> using namespace std; class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 }; int main(){ Box box1; // 聲明一個對象 Box box2; // 聲明一個對象 return 0; }
#include <iostream> using namespace std; class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 }; int main(){ Box box1; // 聲明一個對象 Box box2; // 聲明一個對象 double volume = 0.0; // 定義一個儲存體積的 // 第一個盒子 box1.length = 5.0; box1.breadth = 7.0; box1.height = 5.0; // 第二個盒子 box2.length = 10.0; box2.breadth = 10.0; box2.height = 10.0; // 第一個盒子的體積 volume = box1.length * box1.breadth * box1.height; cout << "第一個盒子的體積" << volume << endl; // 第二個盒子的體積 volume = box2.length * box2.breadth * box2.height; cout << "第二個盒子的體積" << volume << endl; return 0; }
類能夠爲函數成員。c++
#include <iostream> using namespace std; int getVolume(void){ return 3; } class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 double getVolume(void); // 調用函數,將會返回體積。 }; int main(){ return 0; }
#include <iostream> using namespace std; class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 double getVolume(void){ return length * breadth * height; } }; int main(){ return 0; }
訪問解析運算符爲:: 說明函數屬於哪一個類
範圍解析運算符指明函數屬於哪一個類,標明做用域。函數
#include <iostream> using namespace std; int year; // 定義一個全局變量 class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 double getVolume(void){ return length * breadth * height; } }; void setYear(int year){ ::year = year; // 指向全局變量 } int main(){ return 0; }
在類的外部標明類的成員工具
#include <iostream> using namespace std; int year; // 定義一個全局變量 class Box { public: double length; // 定義長度 double breadth; // 定義寬度 double height; // 定義高度 double getVolume(void){ return length * breadth * height; } }; void setYear(int year){ ::year = year; // 指向全局變量 } double Box::getLength(void){ return length; // 此處返回的是Box類下的getLength變量 } int main(){ return 0; }
解決小函數頻繁入棧,出棧的問題,引入inline關鍵字。
即,內聯函數。
使用內聯函數的時候,編譯器會進行自動替換,即相似於C語言中的宏。以減小入棧和出棧的操做。this
這是建議,是否取決於編譯器
使用inline的時候,建議在h文件中,須要的時候寫inline
https://openhome.cc/Gossip/Cp...spa
虛函數,用來實現多重繼承和多態。
這個後期在說指針
數據的封裝爲面向對象的特色。
防止函數直接訪問類的內部成員。
做用域爲一個大花括號code
public在外部能夠訪問
#include <iostream> using namespace std; class Line{ public: double length; void setLength(double len); // 設置length double getLength(void); // 獲取length } // 對成員函數進行定義 double Line::getLength(void){ return length; } void Line::setLength(double len){ length = len; } // 主函數 int main(){ Line line; // 設置長度 line.setLength(6.0); cout << line.getLength() << endl; // 設置長度 line.length = 10.0; cout << line.length << endl; return 0; }
即私有成員,在外部沒法訪問
缺省值爲private 私有的
和私有成員相似,最大的不一樣在於在子類中仍然能夠訪問。
建立對象的時候會執行構造函數
#include <iostream> using namespace std; class Line{ public: void setLength(double len); double getLength(void); Line(); // 構造函數 private: // 私有 double length; }; // 成員函數定義 Line::Line(void) { 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 << line.getLength() << endl; return 0; }
類的特殊成員函數,每次刪除建立的對象將會執行析構函數
java中是直接將指向設置爲null,便可自動進行清除
#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(){ cout << "Object is being deleted" << endl; } void Line::setLength(double len){ length = len; } double Line::getLength(void){ return length; } // 程序主函數 int main(){ Line* line = new Line(); // 設置長度 line->setLength(6.0); cout << line->getLength() << endl; delete line; return 0; }
#include <iostream> using namespace std; class Line{ public: void setLength(double len); double getLength(void); Line(); // 構造函數 ~Line(); // 析構函數 private: // 私有 double length; }; // 成員函數定義 Line::Line(void):length(3) // 等價於內部定義 length = 3 { cout << "Object is being created" << endl; } Line::~Line(){ cout << "Object is being deleted" << endl; } void Line::setLength(double len){ length = len; } double Line::getLength(void){ return length; } // 程序主函數 int main(){ Line* line = new Line(); // 設置長度 line->setLength(6.0); cout << line->getLength() << endl; delete line; return 0; }
須要注意的是,聲明的時候是按照聲明的順序進行初始化的,而不是根據初始化列表進行初始化的
一種特殊的構造函數。
這裏會涉及到深拷貝和淺拷貝的問題,深拷貝開闢空間,淺拷貝進行引用
使用的場景
把對象傳入函數
將對象返回函數
深拷貝,淺拷貝,即便用同類型的對象初始化一個新的對象
類中有指針變量,動態內存分配的時候,必須設置一個拷貝構造函數,若是沒有編譯器會自動生成拷貝構造函數
#include <iostream> using namespace std; class Line{ public: int getLength(void); void setLength(int length); Line(int len); Line(const Line &obj); // 拷貝構造函數 傳入的是地址 ~Line(); private: int* ptr; // 定義一個空指針 }; // 設置成員函數,以及構造函數 Line::Line(int len){ cout << "調用構造函數" << endl; // 進行內存分配 ptr = new int; // 在堆中建立內存空間,完成指向 *ptr = len; // 將傳入的內容進行復制到新開闢在堆中的內存空間 } Line::Line(const Line &obj){ cout << "調用拷貝構造函數併爲指針ptr分配內存,即完成深拷貝" << endl; ptr = new int; // 從新開闢出一塊新的內存空間,完成深拷貝 *ptr = *obj.ptr; // 將待拷貝的,進行內容的賦值 } Line::~Line(void){ // 析構函數 cout << "釋放內存" << endl; delete ptr; // 將指針刪除,此時在堆中的一併刪除 } int Line::getLength(void){ return *ptr; // 返回指向堆中int的內容 } void Line::setLength(int length){ *ptr = length; } void display(Line obj){ // 傳入一個對象 建立了一個副本,此時有兩分內存。同時儲存着obj cout << "line 大小:" << obj.getLength() << endl; // 進行賦值 obj.setLength(3); cout << "line 大小:" << obj.getLength() << endl; } // 主函數 int main(){ // 進行拷貝初始化 Line line1(10); //Line line3 = line1; Line line2 = line1; // 調用拷貝構造函數,建立了一塊新的空間 display(line1); display(line2); cout << line1.getLength() << endl; line1.setLength(4); cout << line1.getLength() << endl; return 0; }
友元函數定義在外部,可是有權訪問內部成員。
須要在原型中使用friend關鍵字
#include <iostream> using namespace std; class Box{ double width; // 缺省值爲私有的 public: friend void printWidth(Box box); // 定義友元函數,友元函數沒有this指針 void setWidth(double wid); }; // 成員函數定義 void Box::setWidth(double wid){ width = wid; } // 友元函數不是任何類的成員函數 void printWidth(Box box){ // 友元函數能夠訪問類中的任何成員 cout << "width of box" << box.width << endl; } int main(){ Box* box = new Box(); // 使用成員函數設置寬度 box -> setWidth(10.0); // 使用友元函數輸出寬度 printWidth(*box); return 0; }
每個對象能夠經過this指針訪問本身的地址。
#include <iostream> using namespace std; class Box{ public: // 構造函數定義 Box(double l = 2.0, double b = 2.0, double h = 2.0){ cout << "開始輸出值" << endl; length = 1; breadth = b; height = h; } double Volume(){ return length * breadth * height; } int compare(Box box){ return this -> Volume() > box.Volume(); // this指向調用的對象,返回一個布爾值 } private: double length; double breadth; double height; }; int main(void){ Box Box1(3.3, 1.2, 1.5); Box Box2(8.5, 6.0, 2.0); cout << Box1.compare(Box2) << endl; return 0; }
使用static關鍵字
經常使用於定義工具函數
靜態成員函數,沒有this指針,只能訪問靜態成員。
普通成員有this指針,能夠訪問類中的任意成員,靜態成員函數沒有this指針。
初始化使用
int Box::objectCount = 0;
至於爲何要在外面定義,由於要進行分配內存空間。而類僅僅是定義。