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

 更新时间:2022年08月10日 15:14:38   作者:FussyCat  
这篇文章主要介绍了C++中的struct和class的区别详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何在VS2019和VScode中配置C++调用python接口

    详解如何在VS2019和VScode中配置C++调用python接口

    这篇文章主要介绍了详解如何在VS2019和VScode中配置C++调用python接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C++之eigen安装与测试方式

    C++之eigen安装与测试方式

    这篇文章主要介绍了C++之eigen安装与测试方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • C++中四种对象生存期和作用域以及static的用法总结分析

    C++中四种对象生存期和作用域以及static的用法总结分析

    以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++ COM编程之什么是组件?

    C++ COM编程之什么是组件?

    这篇文章主要介绍了COM编程之什么是组件?COM组件是以Win32动态链接库(DLLs)或可执行文件(EXEs)的形式发布的可执行代码,需要的朋友可以参考下
    2014-10-10
  • 学习二维动态数组指针做矩阵运算的方法

    学习二维动态数组指针做矩阵运算的方法

    这片文章介绍了如何利用二维动态数组指针做矩阵运算,需要的朋友可以参考下
    2015-07-07
  • 使用C语言实例描述程序中的内聚和耦合问题

    使用C语言实例描述程序中的内聚和耦合问题

    这篇文章主要介绍了用C语言实例描述程序中的内聚和耦合,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • C语言实现班级学生管理系统

    C语言实现班级学生管理系统

    这篇文章主要为大家详细介绍了C语言实现班级学生管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言 二叉树的链式存储实例

    C语言 二叉树的链式存储实例

    本篇文章主要介绍C语言中二叉树的链式存储,这里提供了一个实例代码进行参考,这样对二叉树的链式存储有更深入的了解,希望能帮到学习这块知识的同学
    2016-07-07
  • 200行C语言代码实现简易三子棋游戏

    200行C语言代码实现简易三子棋游戏

    三子棋(井字棋)我们的童年或多或少都体验过这个游戏的乐趣,本子随手一画就是一局游戏的开始,下面这篇文章主要给大家介绍了关于200行C语言代码实现简易三子棋游戏的相关资料,需要的朋友可以参考下
    2023-05-05
  • C语言实现数字游戏

    C语言实现数字游戏

    这篇文章主要为大家详细介绍了C语言实现数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01

最新评论