欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中的struct和class的區(qū)別詳解

 更新時間:2022年08月10日 15:14:38   作者:FussyCat  
這篇文章主要介紹了C++中的struct和class的區(qū)別詳解,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下

1. C++的struct和class的區(qū)別

差異特性structclass
成員訪問范圍默認public默認private
繼承關系訪問范圍默認public默認private
{}初始化1、純數據或純數據+普通方法的結構體支持;2、帶構造函數或虛方法的結構體不支持不支持

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; // 編譯出錯,應改為public int age;

【擴展】如果不增加public關鍵字,又想在某個類如ClassA中能訪問到這個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;
}

關于友元類的使用,可見c++論壇:https://cplusplus.com/forum/beginner/147733/

1.1 繼承關系訪問范圍的差異

指的是子對象是否可訪問到父對象中的成員。

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);
}

編譯錯誤:不可訪問。

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);
}

編譯錯誤:不可訪問。

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);
}

訪問正常。

【總結】

  • 1)子為class的,要想訪問到父的public成員,需要加public關鍵字,即class: public xxx
  • 2)子為struct,可加可不加public,都能訪問到父類/結構體的成員

1.3 {}初始化的差異

struct – 純數據+一般方法

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());
}

可直接用{}初始化數據:

struct – 帶構造函數

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());
}

編譯失?。?/strong>

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ū)別

到此這篇關于C++中的struct和class的區(qū)別詳解的文章就介紹到這了,更多相關C++的struct與class內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • tcp socket客戶端和服務端示例分享

    tcp socket客戶端和服務端示例分享

    這篇文章主要介紹了tcp socket客戶端和服務端示例,需要的朋友可以參考下
    2014-03-03
  • C語言實現掃雷游戲詳細流程

    C語言實現掃雷游戲詳細流程

    windows自帶的游戲《掃雷》是陪伴了無數人的經典游戲,本文將利用C語言實現這一經典的游戲,文中的示例代碼講解詳細,感興趣的可以學習一下
    2022-05-05
  • Qt使用OpenGL實現繪制3D圖形

    Qt使用OpenGL實現繪制3D圖形

    OpenGL是一個跨平臺的、用來渲染3D圖形的標準API,Qt對OpenGL提供了強大的支持,所以本文就來和大家介紹一下Qt如何使用OpenGL實現繪制3D圖形吧
    2023-10-10
  • c++中關于int、long、long?long等取值范圍

    c++中關于int、long、long?long等取值范圍

    這篇文章主要介紹了c++中關于int、long、long?long等取值范圍,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • C/C++實現Windows注冊表的基本操作

    C/C++實現Windows注冊表的基本操作

    Windows注冊表(Registry)是Windows操作系統(tǒng)中用于存儲系統(tǒng)配置信息、用戶設置和應用程序數據的一個集中式數據庫,本文主要為大家介紹了C++對注冊表的基本操作,感興趣的小伙伴可以了解下
    2023-11-11
  • C++實現隨機數生成的現代化封裝

    C++實現隨機數生成的現代化封裝

    在現代?C++?中,隨機數生成是許多程序設計中不可或缺的部分,例如游戲開發(fā)、算法設計、統(tǒng)計模擬等,本文將以一個封裝好的隨機工具類?Random?為例,深入剖析其功能的實現與使用,并引入相關知識,幫助讀者觸類旁通,掌握?C++?隨機數的核心技巧
    2024-11-11
  • C++算法實現leetcode 1252奇數值單元格數目

    C++算法實現leetcode 1252奇數值單元格數目

    這篇文章為大家主要介紹了C++實現leetcode 1252奇數值單元格的數目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • C++繼承類成員訪問權限修飾符詳解

    C++繼承類成員訪問權限修飾符詳解

    這篇文章主要為大家介紹了C++繼承類成員訪問權限修飾符,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 詳解C++實現拓撲排序算法

    詳解C++實現拓撲排序算法

    拓撲排序是對一個有向無環(huán)圖(Directed Acyclic Graph簡稱DAG)G進行拓撲排序,是將G中所有頂點排成一個線性序列,使得圖中任意一對頂點u和v,若邊(u,v)∈E(G),則u在線性序列中出現在v之前。本文將對其原理進行講解,并且用C++進行實現
    2021-06-06
  • 帶你搞懂C++ LeeCode 二叉樹的中序遍歷

    帶你搞懂C++ LeeCode 二叉樹的中序遍歷

    中序遍歷(LDR)是二叉樹遍歷的一種,也叫做中根遍歷、中序周游。在二叉樹中,中序遍歷首先遍歷左子樹,然后訪問根結點,最后遍歷右子樹
    2021-07-07

最新評論