C++ 面向對象 一

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

解決小函數頻繁入棧,出棧的問題,引入inline關鍵字。
即,內聯函數。
使用內聯函數的時候,編譯器會進行自動替換,即相似於C語言中的宏。以減小入棧和出棧的操做。this

這是建議,是否取決於編譯器

使用inline的時候,建議在h文件中,須要的時候寫inline
https://openhome.cc/Gossip/Cp...spa

關於虛函數

虛函數,用來實現多重繼承和多態。
這個後期在說指針

類訪問修飾符

數據的封裝爲面向對象的特色。
防止函數直接訪問類的內部成員。
做用域爲一個大花括號code

public成員

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 成員

即私有成員,在外部沒法訪問

缺省值爲private 私有的

protected 保護成員

和私有成員相似,最大的不一樣在於在子類中仍然能夠訪問。

構造函數 析構函數

構造函數

建立對象的時候會執行構造函數

#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指針

每個對象能夠經過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;

至於爲何要在外面定義,由於要進行分配內存空間。而類僅僅是定義。

相關文章
相關標籤/搜索