C++中的struct和class的區(qū)別詳解
1. C++的struct和class的區(qū)別
| 差異特性 | struct | class |
|---|---|---|
| 成員訪問范圍 | 默認(rèn)public | 默認(rèn)private |
| 繼承關(guān)系訪問范圍 | 默認(rèn)public | 默認(rèn)private |
| {}初始化 | 1、純數(shù)據(jù)或純數(shù)據(jù)+普通方法的結(jié)構(gòu)體支持;2、帶構(gòu)造函數(shù)或虛方法的結(jié)構(gòu)體不支持 | 不支持 |
1.1 成員訪問范圍的差異
struct
struct Person {
int age;
}
Person person = new Person();
person.age = 12;可以正常的編譯和執(zhí)行。
class
class Person {
int age;
}
Person person = new Person();
person.age = 12; // 編譯出錯(cuò),應(yīng)改為public int age;【擴(kuò)展】如果不增加public關(guān)鍵字,又想在某個(gè)類如ClassA中能訪問到這個(gè)Person類中的成員,可以通過友元類(friend class Xxx)來將Person中的private和protected的成員共享出去。
Person類可以這么編寫:
struct Person {
friend class ClassA;
int age;
}
Person person = new Person();
person.age = 12;在ClassA中,就可以訪問Person中的所有成員了。
void ClassA:setAge() {
Person *person = new Person();
person->age = 12;
}關(guān)于友元類的使用,可見c++論壇:https://cplusplus.com/forum/beginner/147733/
1.1 繼承關(guān)系訪問范圍的差異
指的是子對(duì)象是否可訪問到父對(duì)象中的成員。
struct : struct
struct SBase {
public:
int age = 0;
SBase() = default;
virtual ~SBase() = default;
};
struct Person : SBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}訪問正常:

struct : class
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
struct Person : CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}訪問正常。
struct : private class
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
struct Person : private CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}編譯錯(cuò)誤:不可訪問。

class : class
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
class Person : CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}編譯錯(cuò)誤:不可訪問。
class : public class
class CBase {
public:
int age = 0;
CBase() = default;
virtual ~CBase() = default;
};
class Person : public CBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}訪問正常。
class : struct
struct SBase {
public:
int age = 0;
SBase() = default;
virtual ~SBase() = default;
};
struct Person : SBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}訪問正常。
class : public struct
struct SBase {
public:
int age = 0;
SBase() = default;
virtual ~SBase() = default;
};
struct Person : public SBase {
public:
Person() = default;
virtual ~Person() = default;
};
int main(int argc, const char **argv)
{
Person* child = new Person();
child->age = 1;
fprintf(stdout, "test: age=%d\n", child->age);
}訪問正常。
【總結(jié)】
- 1)子為class的,要想訪問到父的public成員,需要加public關(guān)鍵字,即class: public xxx
- 2)子為struct,可加可不加public,都能訪問到父類/結(jié)構(gòu)體的成員
1.3 {}初始化的差異
struct – 純數(shù)據(jù)+一般方法
struct StructA {
void send();
int a;
long b;
string str;
};
void StructA::send()
{
fprintf(stdout, "StructA: sending...\n");
}
int main(int argc, const char **argv)
{
StructA aS = {12, 34, "a test"};
aS.send();
fprintf(stdout, "StructA: a=%d, b=%ld, str=%s\n", aS.a, aS.b, aS.str.c_str());
}可直接用{}初始化數(shù)據(jù):

struct – 帶構(gòu)造函數(shù)
struct StructA {
void send();
int a;
long b;
string str;
StructA();
};
void StructA::send()
{
fprintf(stdout, "StructA: sending...\n");
}
int main(int argc, const char **argv)
{
StructA aS = {12, 34, "a test"};
aS.send();
fprintf(stdout, "StructA: a=%d, b=%ld, str=%s\n", aS.a, aS.b, aS.str.c_str());
}編譯失?。?/strong>

struct – 帶虛方法
struct StructA {
void virtual send();
int a;
long b;
string str;
};
void StructA::send()
{
fprintf(stdout, "StructA: sending...\n");
}
int main(int argc, const char **argv)
{
StructA aS = {12, 34, "a test"};
aS.send();
fprintf(stdout, "StructA: a=%d, b=%ld, str=%s\n", aS.a, aS.b, aS.str.c_str());
}編譯失敗:

class
class ClassA {
int a;
long b;
string str;
};
int main(int argc, const char **argv)
{
ClassA cA = {12, 34, "a test"};
}編譯失?。?/strong>

2. 拓展 :C和C++的struct的區(qū)別

到此這篇關(guān)于C++中的struct和class的區(qū)別詳解的文章就介紹到這了,更多相關(guān)C++的struct與class內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C/C++中的struct結(jié)構(gòu)體詳細(xì)解讀
- c++中struct和class的區(qū)別小結(jié)
- C++ Struct結(jié)構(gòu)體用法淺析
- C++詳細(xì)講解函數(shù)調(diào)用與Struct和CLass的區(qū)別
- 一起來了解一下C++的結(jié)構(gòu)體?struct
- C++基礎(chǔ) class、struct、union詳細(xì)
- c/c++中struct定義、聲明、對(duì)齊方式解析
- C++結(jié)構(gòu)體struct和類class區(qū)別詳解
- C++ struct 初始化與賦值的實(shí)現(xiàn)
相關(guān)文章
詳解如何在VS2019和VScode中配置C++調(diào)用python接口
這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
C++中四種對(duì)象生存期和作用域以及static的用法總結(jié)分析
以下是對(duì)C++中四種對(duì)象生存期和作用域以及static的用法進(jìn)行了詳細(xì)的介紹,需要的朋友可以過來參考下2013-09-09
學(xué)習(xí)二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算的方法
這片文章介紹了如何利用二維動(dòng)態(tài)數(shù)組指針做矩陣運(yùn)算,需要的朋友可以參考下2015-07-07
使用C語(yǔ)言實(shí)例描述程序中的內(nèi)聚和耦合問題
這篇文章主要介紹了用C語(yǔ)言實(shí)例描述程序中的內(nèi)聚和耦合,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
C語(yǔ)言實(shí)現(xiàn)班級(jí)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)班級(jí)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
C語(yǔ)言 二叉樹的鏈?zhǔn)酱鎯?chǔ)實(shí)例
本篇文章主要介紹C語(yǔ)言中二叉樹的鏈?zhǔn)酱鎯?chǔ),這里提供了一個(gè)實(shí)例代碼進(jìn)行參考,這樣對(duì)二叉樹的鏈?zhǔn)酱鎯?chǔ)有更深入的了解,希望能幫到學(xué)習(xí)這塊知識(shí)的同學(xué)2016-07-07
200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲
三子棋(井字棋)我們的童年或多或少都體驗(yàn)過這個(gè)游戲的樂趣,本子隨手一畫就是一局游戲的開始,下面這篇文章主要給大家介紹了關(guān)于200行C語(yǔ)言代碼實(shí)現(xiàn)簡(jiǎn)易三子棋游戲的相關(guān)資料,需要的朋友可以參考下2023-05-05

