C++基礎(chǔ) class、struct、union詳細(xì)
1、類class
類是面向?qū)ο笾械奶匦裕赾中是沒有類的概念。通常用class來表示,cpp中有抽象類,但是沒有接口這種說法,cpp支持多繼承。
一個(gè)普通的類:
class Fruit { private: public: Fruit(); ~Fruit(); }; Fruit::Fruit() { } Fruit::~Fruit() { }
構(gòu)造函數(shù)和析構(gòu)函數(shù):
其中Fruit()
表示構(gòu)造函數(shù), ~Fruit()
表示析構(gòu)函數(shù)。構(gòu)造函數(shù)用來創(chuàng)建對(duì)象,設(shè)置初始化參數(shù)。析構(gòu)函數(shù)在對(duì)象銷毀的時(shí)候執(zhí)行。
修飾符:
private
:表示私有成員,外部不可訪問,只有自身類和友元函數(shù)可以訪問。
public
:表示公共成員,外部可以訪問。
protected
:表示保護(hù)成員,保護(hù)成員和私有成員相似,但是子類可以訪問保護(hù)成員。
類中的成員函數(shù):
我們?cè)陬愔袆?chuàng)建函數(shù)的時(shí)候,可以直接初始化,或者在類外部實(shí)現(xiàn):
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; } //在類外部實(shí)現(xiàn) void Fruit::add(int i){ count = count + i; }
友元函數(shù):
友元函數(shù)雖然可以在類中定義,但是它不屬于類的成員函數(shù),必須在類外部實(shí)現(xiàn)。它可以訪問定義類中的private
和protected
成員。
友元類:友元類中的所有函數(shù)都是該類的友元。
#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
指針: 類的成員函數(shù)中都可以用this指針來訪問類成員,this指針是const指針,不可修改。
虛函數(shù)
、純虛函數(shù)
、抽象類
:
虛函數(shù): 使用關(guān)鍵字virtual修飾
virtual void fuck2(){ cout <<"fuck 2"<<endl; }
虛函數(shù)表示被子類重寫的時(shí)候,調(diào)用子類的函數(shù)而不是父類的此函數(shù)
純虛函數(shù):空的虛函數(shù)
virtual void fuck() = 0;
抽象類: 只要類中有純虛函數(shù)就代表是抽象類
抽象類是被實(shí)體化的,必須通過子類創(chuàng)建。
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; }; };
調(diào)用看輸出結(jié)果:
Apple apple; apple.fuck(); apple.fuck1(); apple.fuck2();
輸出:
fuck apple
fuck 1
fuck apple 22
fuck()
是純虛函數(shù),調(diào)用的是子類fuck1()
調(diào)用的是父類的方法fuck2()
因?yàn)槭翘摵瘮?shù),又被子類重寫了,所以調(diào)用的是子類。如果子類不重寫虛函數(shù),還是會(huì)調(diào)用父類的。
多繼承如下:
class Apple: public Fruit, public Orange{ }
2、結(jié)構(gòu)體struct
cpp
可以用struct
來創(chuàng)建自定義數(shù)據(jù)結(jié)構(gòu),相當(dāng)于java
中的bean
類
創(chuàng)建一個(gè)基本的結(jié)構(gòu)體:
struct Book { string name; int id; long int ISBN; };
可以在} ;
之間創(chuàng)建一個(gè)或多個(gè)結(jié)構(gòu)體對(duì)象:
struct Book { string name; int id; long int ISBN; }book1,book2;
數(shù)據(jù)局初始化:
<!--直接賦值:--> book1.name = "C++ programing"; <!--或者創(chuàng)建的時(shí)候初始化:--> Book book3{ "Android++", 1, 21321231 }; cout<<book3.id<<endl; cout<<book3.name<<endl; cout<<book3.ISBN<<endl;
使用類型別名:
typedef struct{ int id; string name; }Ebook;
我感覺是無用的語法糖。
結(jié)構(gòu)體指針:
Ebook ebook{ 2,"啊哈哈哈" }; Ebook *ptr_book; ptr_book = &ebook; cout<< ptr_book->id <<endl; cout<< ptr_book->name <<endl;
和普通指針沒啥區(qū)別
結(jié)構(gòu)體和class的區(qū)別在哪里?
- 總的來說,
struct
更適合看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體,class
更適合看成是一個(gè)對(duì)象的實(shí)現(xiàn)體。 - 默認(rèn)的繼承訪問權(quán)限:
struct
默認(rèn)是public
的,class
默認(rèn)是private
的。
c和cpp中的struct有什么不同?
- c中只能作為數(shù)據(jù)的結(jié)構(gòu)體,不能有函數(shù),cpp中
struct
是可以有函數(shù)的 - c中沒有修飾符,
cpp
中結(jié)構(gòu)體可以有public
、protected
、private
修飾符 - c中創(chuàng)建結(jié)構(gòu)體必須加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; }
執(zhí)行:
tbook.name = "C++"; tbook.names = "Android++"; tbook.TTT = 1213; tbook.printBook(&tbook);
輸出結(jié)果:
1232342
Android++
1213
C++
3、共用體union
共用體類似于結(jié)構(gòu)體,但是只會(huì)同時(shí)存在一個(gè)數(shù)據(jù)成員,在一個(gè)成員被賦值后,其他成員值將會(huì)丟失。
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將會(huì)丟失 cout << one.j <<endl; return 0; }
共用體特點(diǎn):
- 默認(rèn)訪問控制符為
public
- 可以含有構(gòu)造函數(shù)、析構(gòu)函數(shù)
- 不能含有引用類型的成員
- 不能繼承自其他類,不能作為基類
- 不能含有虛函數(shù)
- 匿名
union
在定義所在作用域可直接訪問union
成員 - 匿名
union
不能包含protected
成員或private
成員 - 全局匿名聯(lián)合必須是靜態(tài)(static)的
配合結(jié)構(gòu)體使用:
struct PEOPLE { string name; union TEST { int id; float id_f; } test; };
到此這篇關(guān)于C++基礎(chǔ) class、struct、union詳細(xì)的文章就介紹到這了,更多相關(guān)C++基礎(chǔ) class、struct、union內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++獲取特定進(jìn)程CPU使用率的實(shí)現(xiàn)代碼
寫一個(gè)小程序在后臺(tái)記錄每個(gè)進(jìn)程的CPU使用情況,揪出鎖屏后占用CPU的進(jìn)程,于是自己寫了一個(gè)C++類CPUusage,方便地監(jiān)視不同進(jìn)程的CPU占用情況。本人編程還只是個(gè)新手,如有問題請(qǐng)多多指教2019-04-04C++實(shí)現(xiàn)循環(huán)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01C++日期類(Date)實(shí)現(xiàn)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C++語言實(shí)現(xiàn)日期類(Date),可以實(shí)現(xiàn)確定某年某月有多少天、打印日期等功能,感興趣的可以了解一下2022-07-07C++段錯(cuò)誤(Segmentation fault)快速定位的解決方法
寫過C++的朋友都知道,有時(shí)候程序編譯通過,并不能代表程序就是對(duì)的,在linux下做開發(fā)時(shí),經(jīng)常會(huì)遇到跑崩潰的情況,但是在終端只會(huì)報(bào)Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯(cuò)誤的快速定位,需要的朋友可以參考下2024-07-07C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表
大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進(jìn)行學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)的人帶來一些幫助,或者是已經(jīng)學(xué)過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧2022-05-05