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

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

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

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

差異特性structclass
成員訪問范圍默認(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; // 編譯出錯,應(yīng)改為public int age;

【擴(kuò)展】如果不增加public關(guān)鍵字,又想在某個類如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;
}

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

1.1 繼承關(guān)系訪問范圍的差異

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

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

訪問正常。

【總結(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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