C++中的struct和class的區(qū)別詳解
1. C++的struct和class的區(qū)別
差異特性 | struct | class |
---|---|---|
成員訪問范圍 | 默認public | 默認private |
繼承關系訪問范圍 | 默認public | 默認private |
{}初始化 | 1、純數據或純數據+普通方法的結構體支持;2、帶構造函數或虛方法的結構體不支持 | 不支持 |
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; // 編譯出錯,應改為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; }
關于友元類的使用,可見c++論壇:https://cplusplus.com/forum/beginner/147733/
1.1 繼承關系訪問范圍的差異
指的是子對象是否可訪問到父對象中的成員。
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); }
訪問正常。
【總結】
- 1)子為class的,要想訪問到父的public成員,需要加public關鍵字,即class: public xxx
- 2)子為struct,可加可不加public,都能訪問到父類/結構體的成員
1.3 {}初始化的差異
struct – 純數據+一般方法
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 – 帶構造函數
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()); }
編譯失?。?/strong>
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ū)別
到此這篇關于C++中的struct和class的區(qū)別詳解的文章就介紹到這了,更多相關C++的struct與class內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!