C++基礎 class、struct、union詳細
1、類class
類是面向對象中的特性,在c中是沒有類的概念。通常用class來表示,cpp中有抽象類,但是沒有接口這種說法,cpp支持多繼承。
一個普通的類:
class Fruit { private: public: Fruit(); ~Fruit(); }; Fruit::Fruit() { } Fruit::~Fruit() { }
構造函數(shù)和析構函數(shù):
其中Fruit()
表示構造函數(shù), ~Fruit()
表示析構函數(shù)。構造函數(shù)用來創(chuàng)建對象,設置初始化參數(shù)。析構函數(shù)在對象銷毀的時候執(zhí)行。
修飾符:
private
:表示私有成員,外部不可訪問,只有自身類和友元函數(shù)可以訪問。
public
:表示公共成員,外部可以訪問。
protected
:表示保護成員,保護成員和私有成員相似,但是子類可以訪問保護成員。
類中的成員函數(shù):
我們在類中創(chuàng)建函數(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; } //在類外部實現(xiàn) void Fruit::add(int i){ count = count + i; }
友元函數(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ù): 使用關鍵字virtual修飾
virtual void fuck2(){ cout <<"fuck 2"<<endl; }
虛函數(shù)表示被子類重寫的時候,調用子類的函數(shù)而不是父類的此函數(shù)
純虛函數(shù):空的虛函數(shù)
virtual void fuck() = 0;
抽象類: 只要類中有純虛函數(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; }; };
調用看輸出結果:
Apple apple; apple.fuck(); apple.fuck1(); apple.fuck2();
輸出:
fuck apple
fuck 1
fuck apple 22
fuck()
是純虛函數(shù),調用的是子類fuck1()
調用的是父類的方法fuck2()
因為是虛函數(shù),又被子類重寫了,所以調用的是子類。如果子類不重寫虛函數(shù),還是會調用父類的。
多繼承如下:
class Apple: public Fruit, public Orange{ }
2、結構體struct
cpp
可以用struct
來創(chuàng)建自定義數(shù)據(jù)結構,相當于java
中的bean
類
創(chuàng)建一個基本的結構體:
struct Book { string name; int id; long int ISBN; };
可以在} ;
之間創(chuàng)建一個或多個結構體對象:
struct Book { string name; int id; long int ISBN; }book1,book2;
數(shù)據(jù)局初始化:
<!--直接賦值:--> book1.name = "C++ programing"; <!--或者創(chuàng)建的時候初始化:--> 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;
和普通指針沒啥區(qū)別
結構體和class的區(qū)別在哪里?
- 總的來說,
struct
更適合看成是一個數(shù)據(jù)結構的實現(xiàn)體,class
更適合看成是一個對象的實現(xiàn)體。 - 默認的繼承訪問權限:
struct
默認是public
的,class
默認是private
的。
c和cpp中的struct有什么不同?
- c中只能作為數(shù)據(jù)的結構體,不能有函數(shù),cpp中
struct
是可以有函數(shù)的 - c中沒有修飾符,
cpp
中結構體可以有public
、protected
、private
修飾符 - c中創(chuàng)建結構體必須加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);
輸出結果:
1232342
Android++
1213
C++
3、共用體union
共用體類似于結構體,但是只會同時存在一個數(shù)據(jù)成員,在一個成員被賦值后,其他成員值將會丟失。
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
- 可以含有構造函數(shù)、析構函數(shù)
- 不能含有引用類型的成員
- 不能繼承自其他類,不能作為基類
- 不能含有虛函數(shù)
- 匿名
union
在定義所在作用域可直接訪問union
成員 - 匿名
union
不能包含protected
成員或private
成員 - 全局匿名聯(lián)合必須是靜態(tài)(static)的
配合結構體使用:
struct PEOPLE { string name; union TEST { int id; float id_f; } test; };
到此這篇關于C++基礎 class、struct、union詳細的文章就介紹到這了,更多相關C++基礎 class、struct、union內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++段錯誤(Segmentation fault)快速定位的解決方法
寫過C++的朋友都知道,有時候程序編譯通過,并不能代表程序就是對的,在linux下做開發(fā)時,經常會遇到跑崩潰的情況,但是在終端只會報Segmentation fault,如果工程代碼量少,你還能重新debug一下慢慢找,本文給大家介紹了C++段錯誤的快速定位,需要的朋友可以參考下2024-07-07