C++中的struct和class的區(qū)別詳解
1. C++的struct和class的區(qū)別
差異特性 | struct | class |
---|---|---|
成員訪問范圍 | 默認(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++中關(guān)于int、long、long?long等取值范圍
這篇文章主要介紹了c++中關(guān)于int、long、long?long等取值范圍,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02C++實現(xiàn)隨機(jī)數(shù)生成的現(xiàn)代化封裝
在現(xiàn)代?C++?中,隨機(jī)數(shù)生成是許多程序設(shè)計中不可或缺的部分,例如游戲開發(fā)、算法設(shè)計、統(tǒng)計模擬等,本文將以一個封裝好的隨機(jī)工具類?Random?為例,深入剖析其功能的實現(xiàn)與使用,并引入相關(guān)知識,幫助讀者觸類旁通,掌握?C++?隨機(jī)數(shù)的核心技巧2024-11-11C++算法實現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目
這篇文章為大家主要介紹了C++實現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08