最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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; // 編譯出錯(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

三门县| 老河口市| 三台县| 阳春市| 寿宁县| 台中市| 池州市| 涡阳县| 大余县| 六盘水市| 佛山市| 元朗区| 平罗县| 庆城县| 美姑县| 南和县| 阿勒泰市| 微博| 永昌县| 安龙县| 安仁县| 龙海市| 桦川县| 苏尼特右旗| 北辰区| 四川省| 蓬莱市| 奈曼旗| 兰州市| 仙桃市| 张家口市| 靖远县| 武邑县| 巫山县| 泉州市| 竹北市| 濮阳市| 松江区| 武功县| 辽阳市| 汤阴县|