C++基礎 class、struct、union詳細

1、類class

類是面向對象中的特性,在c中是沒有類的概念。通常用class來表示,cpp中有抽象類,但是沒有接口這種說法,cpp支持多繼承。

一個普通的類:

class Fruit
{
    private:
        
    public:
        Fruit();
        ~Fruit();
};

Fruit::Fruit()
{
}

Fruit::~Fruit()
{
}

構造函數和析構函數:

其中Fruit()表示構造函數, ~Fruit()表示析構函數。構造函數用來創建對象,設置初始化參數。析構函數在對象銷毀的時候執行。

修飾符:

private:表示私有成員,外部不可訪問,隻有自身類和友元函數可以訪問。
public:表示公共成員,外部可以訪問。
protected:表示保護成員,保護成員和私有成員相似,但是子類可以訪問保護成員。

類中的成員函數:

我們在類中創建函數的時候,可以直接初始化,或者在類外部實現:

class Fruit
{
    private:
        int count;
    public:
        Fruit();
        ~Fruit();

        void add(int i);

        //直接初始化
        int getCount(){
            return count;
        }
};

Fruit::Fruit()
{
    cout << "create fruit" << endl;
}

Fruit::~Fruit()
{
    cout <<"fruit deleted"<<endl;
}

//在類外部實現
void Fruit::add(int i){
    count = count + i;
}

友元函數:

友元函數雖然可以在類中定義,但是它不屬於類的成員函數,必須在類外部實現。它可以訪問定義類中的privateprotected成員。

友元類:友元類中的所有函數都是該類的友元。

#include <iostream>
using namespace std;

class Fruit
{
    private:
        int count = 0;
    public:
        Fruit();
        ~Fruit();

        // friend void printF(Fruit ft);
        friend void printF(Fruit &ft);
};

// void printF(Fruit ft){
//     cout << ft.count <<endl;
// }

void printF(Fruit &ft){
    cout << ft.count <<endl;
}

int main(){

    Fruit fruit;
    
    printF(fruit);

    return 0;
}

this指針: 類的成員函數中都可以用this指針來訪問類成員,this指針是const指針,不可修改。

虛函數純虛函數抽象類

虛函數: 使用關鍵字virtual修飾

        virtual void fuck2(){
            cout <<"fuck 2"<<endl;
        }

虛函數表示被子類重寫的時候,調用子類的函數而不是父類的此函數

純虛函數:空的虛函數

virtual void fuck() = 0;

抽象類: 隻要類中有純虛函數就代表是抽象類

抽象類是被實體化的,必須通過子類創建。

class Fruit
{
    private:
    public:
        Fruit();
        ~Fruit();
        virtual void fuck() = 0;

        void fuck1(){
            cout <<"fuck 1"<<endl;
        }

        virtual void fuck2(){
            cout <<"fuck 2"<<endl;
        }
};

繼承: 註意繼承需使用public修飾,

class Apple: public Fruit
{
    private:
        
    public:
        Apple();
        ~Apple();

        void fuck(){
            cout << "fuck apple"<<endl;
        };

        void fuck2(){
            cout << "fuck apple 22"<<endl;
        };

};

調用看輸出結果:

    Apple apple;
    apple.fuck();
    apple.fuck1();
    apple.fuck2();

輸出:

fuck apple
fuck 1
fuck apple 22

  • fuck()是純虛函數,調用的是子類
  • fuck1()調用的是父類的方法
  • fuck2()因為是虛函數,又被子類重寫瞭,所以調用的是子類。如果子類不重寫虛函數,還是會調用父類的。

多繼承如下:

class Apple: public Fruit, public Orange{
    
}

2、結構體struct

cpp可以用struct來創建自定義數據結構,相當於java中的bean

創建一個基本的結構體:

struct Book
{
    string name;
    int id;
    long int ISBN;
};

可以在} ;之間創建一個或多個結構體對象:

struct Book
{
    string name;
    int id;
    long int ISBN;
}book1,book2;

數據局初始化:

  

  <!--直接賦值:-->
    book1.name = "C++ programing";

    <!--或者創建的時候初始化:-->
    Book book3{
        "Android++",
        1,
        21321231
    };

    cout<<book3.id<<endl;
    cout<<book3.name<<endl;
    cout<<book3.ISBN<<endl;

使用類型別名:

typedef struct{
    int id;
    string name;
}Ebook;

我感覺是無用的語法糖。

結構體指針:

    Ebook ebook{
        2,"啊哈哈哈"
    };

    Ebook *ptr_book;
    ptr_book = &ebook;

    cout<< ptr_book->id <<endl;
    cout<< ptr_book->name <<endl;

和普通指針沒啥區別

結構體和class的區別在哪裡?

  • 總的來說,struct 更適合看成是一個數據結構的實現體,class 更適合看成是一個對象的實現體。
  • 默認的繼承訪問權限:struct 默認是public的,class默認是private的。

c和cpp中的struct有什麼不同?

  • c中隻能作為數據的結構體,不能有函數,cpp中struct是可以有函數的
  • c中沒有修飾符,cpp中結構體可以有publicprotectedprivate修飾符
  • c中創建結構體必須加struct前綴,比如:struct Book book,真是book思議
  • c中沒有繼承概念,cpp中struct可以繼承

演示:

struct TBook : public Book
{
    private:
        int ids = 1232342;
    public:
        string names;
        long int TTT;
        void printBook(TBook *book);
}tbook;

void TBook::printBook(TBook *book){
    cout<<book->ids<<endl;
    cout<<book->names<<endl;
    cout<<book->TTT<<endl;

    cout<<book->name<<endl;
}

執行:

    tbook.name = "C++";
    tbook.names = "Android++";
    tbook.TTT = 1213;

    tbook.printBook(&tbook);

輸出結果:

1232342
Android++
1213
C++

3、共用體union

共用體類似於結構體,但是隻會同時存在一個數據成員,在一個成員被賦值後,其他成員值將會丟失。

union ONE
{
    int i;
    float j;
    double ids[10];
};

int main(){

    ONE one;
    one.i = 123;
    cout << one.i <<endl;

    one.j = 1.0f;
    cout << one.i <<endl;   //one.i將會丟失
    cout << one.j <<endl;

    return 0;
}

共用體特點:

  • 默認訪問控制符為 public
  • 可以含有構造函數、析構函數
  • 不能含有引用類型的成員
  • 不能繼承自其他類,不能作為基類
  • 不能含有虛函數
  • 匿名 union 在定義所在作用域可直接訪問 union 成員
  • 匿名 union 不能包含 protected 成員或 private 成員
  • 全局匿名聯合必須是靜態(static)的

配合結構體使用:

struct PEOPLE
{
    string name;
    union TEST
    {
        int id;
        float id_f;
    } test;
    
};

到此這篇關於C++基礎 class、struct、union詳細的文章就介紹到這瞭,更多相關C++基礎 class、struct、union內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: