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; }
友元函數:
友元函數雖然可以在類中定義,但是它不屬於類的成員函數,必須在類外部實現。它可以訪問定義類中的private
和protected
成員。
友元類:友元類中的所有函數都是該類的友元。
#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
中結構體可以有public
、protected
、private
修飾符 - 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!