浅析C++中struct和class的区别

2023-05-16

文章目录

  • C和C++中struct的区别
  • C++中struct和class的区别

C和C++中struct的区别

struct最早是在C语言中出现的,但在C语言中struct只是一种 用户自定义数据类型(UDT) ,其只能定义数据成员,为了保证兼容性,C++保留了C语言中struct的用法,但在C++中struct是一种 抽象数据类型(ADT) ,同时也对其进行了一些拓展。

C语言中struct不可声明成员函数,在C++中可以

C语言中struct不可以声明静态成员,在C++中可以

C语言中struct的访问控制属性默认为public,不可以就该,在C++中可以有public/private/protect三种属性,默认为public

C语言中struct不可继承,在C++中可以从其他结构体或者类中继承

C语言中struct不可在声明时直接初始化数据成员,在C++中可以

除了以上一些声明时的区别之外,struct在使用时也有所区别。C语言中使用结构体需要加上struct或者通过typename取别名才可以使用,而在C++中则是可以直接使用:

struct student
{
    int grade;
    string name;
}
typename struct student stu;
struct student s1; //C用法1:使用struct声明
stu s2;            //C用法2:使用别名声明
student s3;        //C++用法:直接用结构体名声明

在C语言中,结构体中的数据成员可以直接通过大括号{}进行初始化。这种方式的初始化,是用一个初始化列表来对数据进行初始化操作,这种初始化方式跟memcpy类似,只是一个简单的copy操作。在C++中的结构体,如果 只定义了数据成员 或者只定义了数据成员和普通函数 ,则这种方式依然可以使用:

//对于这类结构体,C/C++都可以使用{}初始化
struct student
{
    int grade;
    string name;
};
student stu = {1,"S.dragon"};//正确

而如果C++中的struct中定义了构造函数,使用花括号{}的方式实际上是以{}内的数据为参数 调用含参构造函数 ,如果未定义含参构造函数或者{}中元素个数和参数列表中形参个数不一致,使用{}赋值则会导致编译器报错:

//如果结构体中未声明定义合适的含参构造函数,则不可以使用{}进行数据成员初始化
struct student
{
    int grade;
    string name;
    student()
    {
        grade = 0;
        name = "student";
    }
};
student stu = {1,"S.dragon"};//错的!
//下面的这种用法就是正确的
struct student
{
    int grade;
    string name;
    student()
    {
        grade = 0;
        name = "student";
    }
    student(int g, string str):grade(g),name(str){}//含参构造函数
};
student stu = {1,"S.dragon"};//正确

在C++中,如果结构体中没有定义含参构造函数且数据类型不是public的时候,不能使用{}进行初始化操作。如果class的成员全是public,或者有含参构造函数的时候也是可以用{}对数据成员进行初始化。

C++中struct和class的区别

上面提到,C++为了对C保持兼容,引入了struct,并对其进行了拓展,使得struct可以拥有静态变量、构造函数、析构函数、成员函数,可以对变量初始化、也可以继承,甚至还可以实现多态。C++对struct的这些拓展使结构体看起来跟类没有区别。但即使它们很像,也不能说他们是一样的。

在C++中两者的核心区别就是继承时默认访问控制属性不一样,struct默认是public继承,class默认是private继承

struct A
{
    int a;
};
struct B:A
{
    int b;
};
class C:A
{
    int c;
};
B b;
C c;
b.a = 21;//struct是public继承因此此操作是正确的
c.a = 21;//class是private继承,所以此操作是错误的

默认的防控属性取决于子类而不是父类,由于容易发声混淆,所以在写代码时最好指明继承方式,以免产生二义性。

有关三种继承的区别可移步:https://blog.csdn.net/Kimmich6/article/details/119255547

struct不可当做定义模板参数,但是class可以,就想typename一样:

template<class T>
    class A
    {
        T a;
        T* p;
        T func();
    }

总结: C中的struct根C++中的struct差别比较大,但经过C++拓展后的struct跟class差别并不大,只要我们在使用的时候显示的指明继承方式,struct和class其实都差不多!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析C++中struct和class的区别 的相关文章

随机推荐

  • C++摸板类 声明对象编译不过 类声明和实现都要放在头文件里

    通常情况下 xff0c 你会在 h文件中声明函数和类 xff0c 而将它们的定义放置在一个单独的 cpp文件中 但是在使用模板时 xff0c 这种习惯性做法将变得不再有用 xff0c 因为当实例化一个模板时 xff0c 编译器必须看到模板确
  • 什么是大端序和小端序,为什么要有字节序

    什么是字节序 字节序 xff0c 又称端序或尾序 xff08 英语中用单词 xff1a Endianness 表示 xff09 xff0c 在计算机领域中 xff0c 指电脑内存中或在数字通信链路中 xff0c 占用多个字节的数据的字节排列
  • opencv4.3.0+Visual Studio 2019环境配置

    1 1 解压opencv并添加环境变量 下载opencv4 3 0 xff0c 进行安装 其实是解压 xff0c 之后配置环境变量 xff0c 我的电脑 gt 属性 gt 高级系统设置 gt 环境变量 xff0c 找到Path变量 xff0
  • 动画图解:十大经典排序算法动画与解析,看我就够了!(配代码完全版)

    排序算法是 数据结构与算法 中最基本的算法之一 排序算法可以分为内部排序和外部排序 内部排序是数据记录在内存中进行排序 而外部排序是因排序的数据很大 xff0c 一次不能容纳全部的排序记录 xff0c 在排序过程中需要访问外存 常见的内部排
  • 什么是 P = NP 问题?

    点击关注上方 五分钟学算法 xff0c 设为 置顶或星标 xff0c 第一时间送达干货 转自后端技术指南针 1 前言 今天和大家一起了解个高能知识点 xff1a P 61 NP问题 看到这里我们可能是一头雾水 xff0c 不由得发问 xff
  • 问题集合 ---- linux 静态库和动态库

    本文转自多网址 xff0c 对作者表示感谢 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 图解:什么是二叉排序树?

    点击关注上方 五分钟学算法 xff0c 设为 置顶或星标 xff0c 第一时间送达干货 转自景禹 景禹的写作风格还是一如既往的细腻 xff1a xff09 xff0c 欢迎关注他 以下为原文 今天我们谈一谈 二叉排序树 xff0c 一种你会
  • B 站疯传,堪称最强,10 大免费的白嫖网站

    点击上方 五分钟学算法 xff0c 选择 星标 公众号 重磅干货 xff0c 第一时间送达 来源 xff1a Python知识圈 如果你喜欢在 B 站学习的话 xff0c 可以经常看到一些介绍网站类的视频 xff0c 这些视频有不俗的播放量
  • 还敢搞黄色?4 个色情网站被一锅端,9 名福利姬被刑拘!

    点击上方 五分钟学算法 xff0c 选择 星标 公众号 重磅干货 xff0c 第一时间送达 来源 xff1a 扩展迷EXTFANS 9月4日 xff0c 据 64 江苏网警 通报 xff1a 今年3月份以来 xff0c 浙江丽水莲都警方根据
  • 为什么有人劝别选计算机专业?

    大家好 xff0c 我是程序员吴师兄 xff0c 一个坚持在 CSDN 日更原创的程序员 今天想和大家聊一聊为什么有人劝别选计算机专业 和大家说一句掏心窝的话 xff1a 直到 2021 年 xff0c 计算机专业依旧是寒门改变命运的一个最
  • 看完谷歌大佬的 LeetCode 刷题笔记,我马上去字节跳动面试!

    如果你刷 LeetCode 觉得吃力 那么一定需要这份谷歌大佬的 LeetCode 刷题笔记 微信搜索 五分钟学算法 xff0c 公众号回复 04 即可获取对应的下载链接 xff0c 以下是详细介绍 在这里推荐一个谷歌大佬的刷题笔记 每一道
  • 剑指 Offer 09. 用两个栈实现队列(视频讲解)

    一 题目描述 用两个栈实现一个队列 队列的声明如下 xff0c 请实现它的两个函数 appendTail 和 deleteHead xff0c 分别完成在队列尾部插入整数和在队列头部删除整数的功能 若队列中没有元素 xff0c delete
  • 刷到 LeetCode 这个评论,被笑到了

    大家好 xff0c 我是吴师兄 今天早上我在 LeetCode 第 141 号问题 环形链表 的评论区中发现了一个称得上是天秀的解法 xff0c 简直太骚气了 xff0c 忍不住分享给大家 首先给没有见过这道题目的小伙伴补充一下前置知识 x
  • Android JNI基础篇(一)

    Android JNI 基础篇 前言 JNI学习其实并不难 xff0c 在这里 xff0c 我将引导大家学习JNI的基础知识 xff0c 认真学完本教程 xff0c 你将更加坚信我说的话 来吧 xff0c 我们一起学习 xff01 JNI
  • ROS学习(三):消息通信过程

    主节点管理节点信息 xff0c 每个节点根据需要与其他节点进行连接和消息通信 在这里 xff0c 我们来看看最重要的主节点 节点 话题 服务和动作信息的过程 一 运行主节点 节点之间的消息通信当中 xff0c 管理连接信息的主节点是为使用R
  • HTTP Digest authentication(摘要认证)和HTTP basic Authorization(普通认证)用户登出注销的方法

    最近项目中需要对普通认证HTTP basic Authorization和摘要认证HTTP Digest authenticatio登录进行注销 搜索到有几篇文章号称ie xff0c Firefox chrome都可以可以注销 xff0c
  • POCO C++库学习和分析 -- 序

    POCO C 43 43 库学习和分析 序 1 POCO库概述 xff1a POCO是一个C 43 43 的开源库集 同一般的C 43 43 库相比 xff0c POCO的特点是提供了整一个应用框架 如果要做C 43 43 程序应用框架的快
  • 【ubuntu18+QT12+OpenCV4环境配置】

    ubuntu18 43 QT12 43 OpenCV4环境配置 前些天编译了最新版本opencv4 xff0c 但是电脑内还有个opencv3 2 xff0c 有时候二者共享链接库文件即libopencv so XX xff0c 之类的路径
  • Ubuntu无法使用浏览器上网

    1 可以更新一下浏览器 xff0c 打开终端 xff0c 输入 xff1a sudo apt get install firefox 如果你用的是其他浏览器可以吧后面的 firefox 改为其他浏览器 xff0c 如谷歌浏览器 xff1a
  • 浅析C++中struct和class的区别

    文章目录 C和C 43 43 中struct的区别C 43 43 中struct和class的区别 C和C 43 43 中struct的区别 struct最早是在C语言中出现的 xff0c 但在C语言中struct只是一种 用户自定义数据类