91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++中的struct和class的區別是什么

發布時間:2022-08-10 16:49:59 來源:億速云 閱讀:175 作者:iii 欄目:開發技術

本篇內容介紹了“C++中的struct和class的區別是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1. C++的struct和class的區別

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

1.1 成員訪問范圍的差異

struct
struct Person {
    int age;
}
Person person = new Person();
person.age = 12;

可以正常的編譯和執行。

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

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

訪問正常:

C++中的struct和class的區別是什么

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

編譯錯誤:不可訪問。

C++中的struct和class的區別是什么

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

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

C++中的struct和class的區別是什么

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

編譯失敗:

C++中的struct和class的區別是什么

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

編譯失敗:

C++中的struct和class的區別是什么

class
class ClassA {
    int a;
    long b;
    string str;
};

int main(int argc, const char **argv)
{
    ClassA cA = {12, 34, "a test"};
}

編譯失敗:

C++中的struct和class的區別是什么

2. 拓展 :C和C++的struct的區別

C++中的struct和class的區別是什么

“C++中的struct和class的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临高县| 老河口市| 于都县| 县级市| 郁南县| 芷江| 青田县| 丽水市| 贵港市| 五华县| 远安县| 临安市| 综艺| 刚察县| 万盛区| 台州市| 抚宁县| 江安县| 徐州市| 龙里县| 沂源县| 本溪| 泽州县| 清丰县| 天柱县| 大洼县| 新丰县| 丰台区| 黑山县| 桦川县| 常山县| 杭锦旗| 德化县| 浦东新区| 天长市| 二连浩特市| 新津县| 万山特区| 子洲县| 龙里县| 西平县|