最新国产好看的视频,伊人天堂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)論

阳原县| 长武县| 任丘市| 汶上县| 海宁市| 正定县| 汉中市| 车致| 晋城| 资阳市| 平昌县| 莱阳市| 锡林郭勒盟| 惠东县| 金坛市| 博野县| 永寿县| 台前县| 舞阳县| 南丰县| 鄂伦春自治旗| 京山县| 根河市| 师宗县| 凤台县| 北宁市| 新津县| 肇州县| 莎车县| 普格县| 综艺| 贺兰县| 合肥市| 容城县| 株洲市| 贡山| 蒙山县| 山东| 乐业县| 湟中县| 额济纳旗|