您好,登錄后才能下訂單哦!
本篇內容介紹了“C++中的struct和class的區別是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
差異特性 | struct | class |
---|---|---|
成員訪問范圍 | 默認public | 默認private |
繼承關系訪問范圍 | 默認public | 默認private |
{}初始化 | 1、純數據或純數據+普通方法的結構體支持;2、帶構造函數或虛方法的結構體不支持 | 不支持 |
struct Person { int age; } Person person = new Person(); person.age = 12;
可以正常的編譯和執行。
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; }
指的是子對象是否可訪問到父對象中的成員。
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 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); }
訪問正常。
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 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 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); }
訪問正常。
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 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,都能訪問到父類/結構體的成員
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()); }
可直接用{}初始化數據:
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()); }
編譯失敗:
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 ClassA { int a; long b; string str; }; int main(int argc, const char **argv) { ClassA cA = {12, 34, "a test"}; }
編譯失敗:
“C++中的struct和class的區別是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。