C++基礎(chǔ) class、struct、union詳細(xì)
1、類class
類是面向?qū)ο笾械奶匦?,在c中是沒有類的概念。通常用class來(lái)表示,cpp中有抽象類,但是沒有接口這種說(shuō)法,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ù)用來(lái)創(chuàng)建對(duì)象,設(shè)置初始化參數(shù)。析構(gòu)函數(shù)在對(duì)象銷毀的時(shí)候執(zhí)行。
修飾符:
private:表示私有成員,外部不可訪問(wèn),只有自身類和友元函數(shù)可以訪問(wèn)。
public:表示公共成員,外部可以訪問(wèn)。
protected:表示保護(hù)成員,保護(hù)成員和私有成員相似,但是子類可以訪問(wèn)保護(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)。它可以訪問(wè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指針來(lái)訪問(wèn)類成員,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í)體化的,必須通過(guò)子類創(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來(lái)創(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;
我感覺是無(wú)用的語(yǔ)法糖。
結(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ū)別在哪里?
- 總的來(lái)說(shuō),
struct更適合看成是一個(gè)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)體,class更適合看成是一個(gè)對(duì)象的實(shí)現(xiàn)體。 - 默認(rèn)的繼承訪問(wè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)訪問(wèn)控制符為
public - 可以含有構(gòu)造函數(shù)、析構(gòu)函數(shù)
- 不能含有引用類型的成員
- 不能繼承自其他類,不能作為基類
- 不能含有虛函數(shù)
- 匿名
union在定義所在作用域可直接訪問(wèn)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語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法之實(shí)現(xiàn)快速傅立葉變換的相關(guān)資料,需要的朋友可以參考下2017-06-06
C語(yǔ)言中返回錯(cuò)誤信息的相關(guān)函數(shù)用法總結(jié)
這篇文章主要介紹了C語(yǔ)言中返回錯(cuò)誤信息的相關(guān)函數(shù)用法總結(jié),包括strerror()函數(shù)和perror()函數(shù)以及ferror()函數(shù)的使用,需要的朋友可以參考下2015-09-09
C語(yǔ)言利用鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言如何利用鏈表實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-11-11
C++實(shí)現(xiàn)LeetCode(35.搜索插入位置)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(35.搜索插入位置),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言實(shí)現(xiàn)繪制立體餅圖的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何使用C語(yǔ)言實(shí)現(xiàn)繪制立體餅圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03
C++實(shí)現(xiàn)動(dòng)態(tài)線性表
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)線性表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05

