C++中的struct和class的区别详解

目录

1. C++的struct和class的区别

1.1 成员访问范围的差异

struct

class

1.1 继承关系访问范围的差异

struct : struct

struct : class

struct : private class

class : class

class : public class

class : struct

class : public struct

1.3 {}初始化的差异

struct – 纯数据+一般方法

struct – 带构造函数

 struct – 带虚方法

class

2. 拓展 :C和C++的struct的区别

1. C++的struct和class的区别 差异特性structclass
成员访问范围默认public默认private
继承关系访问范围默认public默认private
{}初始化1、纯数据或纯数据+普通方法的结构体支持;2、带构造函数或虚方法的结构体不支持不支持
1.1 成员访问范围的差异 struct struct Person { int age; } Person person = new Person(); person.age = 12;

可以正常的编译和执行。

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()); }

编译失败:

 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"}; }

编译失败:

2. 拓展 :C和C++的struct的区别

到此这篇关于C++中的struct和class的区别详解的文章就介绍到这了,更多相关C++的struct与class内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!

推荐阅读

    class文件怎么打开

    class文件怎么打开,文件,类文件,工具,编译,反编译工具,打开方式,  .class文件为java类文件,用DJ Java Decompiler可以打开。java类文件,装了ja

    Java中的ClassCastException异常的产生原因和解决方法

    Java中的ClassCastException异常的产生原因和解决方法,类型,类型转换,对象,接口,抛出,类的加载,Java是目前世界上使用最为广泛的编程语言之一,其

    存储卡的class是什么意思

    存储卡的class是什么意思,规范,读取,数字,需求,速率,内存卡,存储卡的class是什么意思存储卡的class是什么意思?有些网友对于这些专业的词语不太

    Ant中的classpath配置和使用

    Ant中的classpath配置和使用,是一个,适合,Ant手册中配置classpath采用classpath标签,可是我发现这样配置总是不好用,还是直接用path设置clas

    constructor属性和typeof(

    constructor属性和typeof(,类型,变量,constructor属性和typeof()属性的区别,用法有什么不同typeof()是一个方法,会把所有的数组类型以及用户自定