1、類class
類是面向對象中的特性,在c中是沒有類的概念。通常用class來表示,cpp中有抽象類,但是沒有接口這種說法,cpp支持多繼承。
一個普通的類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Fruit { private : public : Fruit(); ~Fruit(); }; Fruit::Fruit() { } Fruit::~Fruit() { } |
構造函數和析構函數:
其中Fruit()
表示構造函數, ~Fruit()
表示析構函數。構造函數用來創建對象,設置初始化參數。析構函數在對象銷毀的時候執行。
修飾符:
private
:表示私有成員,外部不可訪問,只有自身類和友元函數可以訪問。
public
:表示公共成員,外部可以訪問。
protected
:表示保護成員,保護成員和私有成員相似,但是子類可以訪問保護成員。
類中的成員函數:
我們在類中創建函數的時候,可以直接初始化,或者在類外部實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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
成員。
友元類:友元類中的所有函數都是該類的友元。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#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修飾
1
2
3
|
virtual void fuck2(){ cout << "fuck 2" <<endl; } |
虛函數表示被子類重寫的時候,調用子類的函數而不是父類的此函數
純虛函數:空的虛函數
1
|
virtual void fuck() = 0; |
抽象類: 只要類中有純虛函數就代表是抽象類
抽象類是被實體化的,必須通過子類創建。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Fruit { private : public : Fruit(); ~Fruit(); virtual void fuck() = 0; void fuck1(){ cout << "fuck 1" <<endl; } virtual void fuck2(){ cout << "fuck 2" <<endl; } }; |
繼承: 注意繼承需使用public
修飾,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class Apple: public Fruit { private : public : Apple(); ~Apple(); void fuck(){ cout << "fuck apple" <<endl; }; void fuck2(){ cout << "fuck apple 22" <<endl; }; }; |
調用看輸出結果:
1
2
3
4
|
Apple apple; apple.fuck(); apple.fuck1(); apple.fuck2(); |
輸出:
fuck apple
fuck 1
fuck apple 22
-
fuck()
是純虛函數,調用的是子類 -
fuck1()
調用的是父類的方法 -
fuck2()
因為是虛函數,又被子類重寫了,所以調用的是子類。如果子類不重寫虛函數,還是會調用父類的。
多繼承如下:
1
2
3
|
class Apple: public Fruit, public Orange{ } |
2、結構體struct
cpp
可以用struct
來創建自定義數據結構,相當于java
中的bean
類
創建一個基本的結構體:
1
2
3
4
5
6
|
struct Book { string name; int id; long int ISBN; }; |
可以在} ;
之間創建一個或多個結構體對象:
1
2
3
4
5
6
|
struct Book { string name; int id; long int ISBN; }book1,book2; |
數據局初始化:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<!--直接賦值:--> book1.name = "C++ programing" ; <!--或者創建的時候初始化:--> Book book3{ "Android++" , 1, 21321231 }; cout<<book3.id<<endl; cout<<book3.name<<endl; cout<<book3.ISBN<<endl; |
使用類型別名:
1
2
3
4
|
typedef struct { int id; string name; }Ebook; |
我感覺是無用的語法糖。
結構體指針:
1
2
3
4
5
6
7
8
9
|
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可以繼承
演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
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; } |
執行:
1
2
3
4
5
|
tbook.name = "C++" ; tbook.names = "Android++" ; tbook.TTT = 1213; tbook.printBook(&tbook); |
輸出結果:
1232342
Android++
1213
C++
3、共用體union
共用體類似于結構體,但是只會同時存在一個數據成員,在一個成員被賦值后,其他成員值將會丟失。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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)的
配合結構體使用:
1
2
3
4
5
6
7
8
9
10
|
struct PEOPLE { string name; union TEST { int id; float id_f; } test; }; |
到此這篇關于C++基礎 class、struct、union詳細的文章就介紹到這了,更多相關C++基礎 class、struct、union內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7012541007459778590