c++:struct和class的区别

news2025/4/21 13:36:58

C和C++中struct的区别

(1)C中不支持成员函数(只能通过函数指针成员变量间接支持),而C++源生支持。
(2)C中不支持static成员,而C++中支持。后面会详细讲,C++ static class是一个大知识点
(3)访问权限,C中默认public,C++中默认public,但是可以显式指定public/private/protected三者之一
(4)继承特性上,C中不支持(只能通过结构体包含来间接实现),而C++源生支持,且struct和class可以互相继承
(5)初始化方面,C中靠初始化式(gcc扩展了初始化语法),而C++靠构造函数所以初始化更自由可定制化
在这里插入图片描述

  • C++中struct和class的区别
    (1)默认成员权限,struct默认public,class默认private
    (2)继承关系的权限管控,struct默认public,class默认private
    (3)struct和class交叉继承时,默认的权限管控取决于子类而不是基类
    (4)模板相关使用都用class,而不用struct了

  • 总结
    (1)C++中struct和class差别不大,大多数情况下都可以直接替换使用而不出错
    (2)C++中struct其实有点“人格分裂”,他既要兼容C中struct,又要像C++的class
    (3)结论:除非是只需要打包几个变量数据就用C方式的struct,否则如果需要面向对象式编程就用class

const和mutable是干嘛的

  • const可以实现常函数
    (1)常函数,就是class的成员函数承诺在函数内部不会修改class的任何成员变量,注意是任何一个
    (2)常函数演示案例
    (3)思考:C++为什么设计常函数?还是为了class的设计者和使用者更好的协作,避免错误的使用类库

  • mutable可以局部打破const常函数
    (1)const常函数承诺在函数内不会修改class的任何一个成员变量
    (2)但是有时候个别成员变量,就是需要在const的常函数中也能修改(注意只是个别,其他大部分是不需要修改的)
    (3)怎么办?2个解法:要么去掉const,要么使用mutable局部打洞
    (4)mutable使用演示
    (5)思考:C++为什么设计mutable?和private那里一样,还是“先全部禁了再按需打开”的思路。
    mutable关键字只能修饰数据成员,而不能修饰方法

#include <iostream>
#include <string>

class ClassInfo {
private:
    std::string className;
    int classSize;
    mutable int accessCount; // 使用mutable关键字

public:
    ClassInfo(const std::string &name, int size)
        : className(name), classSize(size), accessCount(0) {}

    std::string getClassName() const {
        ++accessCount; // 修改mutable成员变量
        return className;
    }

    int getClassSize() const {
        ++accessCount; // 修改mutable成员变量
        return classSize;
    }

    int getAccessCount() const {
        return accessCount;
    }
};

int main() {
    ClassInfo classInfo("Mathematics", 30);

  std::cout << "Access Count: " << classInfo.getAccessCount() << std::endl;
  std::cout << "Class Name: " << classInfo.getClassName() << std::endl;
  std::cout << "Class Size: " << classInfo.getClassSize() << std::endl;
  std::cout << "Access Count: " << classInfo.getAccessCount() << std::endl;

    return 0;
}


class的前置声明

(1)就是class的声明,安慰编译器的
(2)看到了认识即可

#include <iostream>

// 前置声明
class ClassB;

class ClassA {
public:
    void setClassB(ClassB* b);
    void showClassB();
private:
    ClassB* b;
};

class ClassB {
public:
    ClassB(int value) : value(value) {}
    int getValue() const { return value; }
private:
    int value;
};

void ClassA::setClassB(ClassB* b) {
    this->b = b;
}

void ClassA::showClassB() {
    if (b) {
        std::cout << "ClassB value: " << b->getValue() << std::endl;
    } else {
        std::cout << "ClassB is not set." << std::endl;
    }
}

int main() {
    ClassA a;
    ClassB b(42);

    a.setClassB(&b);
    a.showClassB();

    return 0;
}

  • class ClassB 在 ClassA 之前进行了前置声明。
  • 在 ClassA 中,我们声明了一个 ClassB* b 指针。
  • ClassB 的完整定义出现在 ClassA 之后。
  • 这样做允许我们在 ClassA 的成员函数中使用 ClassB 的指针,而不需要在 ClassA 的头文件中包含 ClassB 的完整定义。

inline member function

(1)类的声明中直接写函数体,则此函数会被编译器inline化处理
(2)类的声明中正常处理,而成员函数的实现中加inline
(3)inline的成员函数应该放在hpp中而不是cpp中,这个一定要注意,因为inline是在编译时替换的

  • 本课程总结
    (1)本课程主要在讲C++的封装特性,以及由此引发的各种细节语法特性。
    (2)语法上掌握是第一层,会写代码跑起来是第二层,遇到问题能调出来是第三层,理解设计原理是第四层。

总结

const使用方法、
理解什么是mutable局部打洞
理解什么是前置声明
类声明里面写函数实体,就是inline化

学习记录,侵权联系删除。
来源:朱老师物联网大课堂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1902099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CS61B Data Structure-Jonathan Lecture2 using objects - OBJECTS METHODS

Recall String s1; // Step 1: declare a String variable s1 new String(); // Step 2: assign it a value, a new empty string objectString s2 new String(); // 1&2 combined今日知识点 situation: pointing to the same object s1 "Yow!";s2 s1; //…

电量监测与电量计基础知识

硬件之路学习笔记 ​-----前文导读----- ①、公众号主页点击发消息 ②、点击下方菜单获取系列文章 -----本文简介----- 主要内容包括&#xff1a; ①&#xff1a;简介 ②&#xff1a;省成本方式-电阻分压 ③&#xff1a;精确方式-电量计与阻抗跟踪技术 ----- 正文 ----…

线程同步66666

1. 概述 当有多个线程访问同一个共享资源&#xff08;临界资源&#xff09;时&#xff0c;且不允许同时访问&#xff0c;那么就需要线程同步。常见的线程同步方式&#xff1a;互斥锁、读写锁、条件变量、信号量。 2. 互斥锁 互斥锁的方式可以简单概括为&#xff1a;锁定操作…

第一天(点亮led灯+led灯闪烁)——Arduino uno R3 学习之旅

​ 常识: 一般智能手机的额定工作电流大约为200mA Arduino Uno板上I/0(输入/输出)引脚最大输出电流为40 mA Uno板控制器总的输出电流为200 mA 点亮LED灯 发光二极管介绍 发光二极管(Light Emitting Diode&#xff0c;简称LED)是一种能够将电能转化为光能的固态的半导体器件…

好消息!Stable Diffusion 3 允许商业化,很快开源更大版本模型

7月6日凌晨&#xff0c;著名开源大模型平台Stability AI修改了社区许可协议&#xff0c;最新发布的文生图模型Stable Diffusion 3 Medium允许商业化&#xff08;以下简称“SD3-M”&#xff09;。 如果企业、个人开发者每年收入低于100万美元&#xff08;大约726万元人民币&…

【漏洞复现】禅道——未授权登入(QVD-2024-15263)

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 禅道&#xff08;Zentao&#xff09;是一款开源的项目管理和协作…

AI文本转语音,再也不用担心视频配音了.

文章目录 简介代码实现调用开通百度付费包 简介 背景 我想要将文本,转为语音,然后配上图片,这样就可以很快生成一个视频. 可以说是配音吧,我还是比较喜欢通过代码来自动化.所以今天就来实现一下,同时做一下分享和记录.目标 通过python代码,自动将文本转为配音.平台 我选择了百…

MySQL:如何在已经使用的数据表中增加一个自动递增的字段

目录 一、需求 二、实现步骤 &#xff08;一&#xff09;数据表students &#xff08;二&#xff09;添加整型字段 &#xff08;三&#xff09;更新SID字段的值 1、使用用户定义的变量和JOIN操作 2、用SET语句和rownum变量 &#xff08;1&#xff09;操作方法 &#x…

法向量 - 平面上的法向量和曲面上的法向量

法向量 - 平面上的法向量和曲面上的法向量 flyfish 平面上的法向量 &#xff1a; 定义了一个平面 z 0 z 0 z0。 法向量是 (0, 0, 1)&#xff0c;表示垂直于平面的向上方向。 使用 quiver 函数在平面上绘制法向量。 曲面上的法向量 &#xff1a; 定义了一个曲面 z x 2…

硬件开发工具Arduino IDE

招聘信息共享社群 关联上篇文章乐鑫ESPRESSIF芯片开发简介 Arduino IDE&#xff08;集成开发环境&#xff09;是为Arduino硬件开发而设计的一款软件&#xff0c;它提供了一个易于使用的图形界面&#xff0c;允许用户编写、编辑、编译和上传代码到Arduino开发板。Arduino IDE的…

封装日历uniapp,只显示年月不显示日

默认展示最新日期 子组件 <template><view class"date-picker"><picker mode"date" fields"month" change"onDateChange" :value"selectedDate"><view class"picker">{{ selectedDate…

SQL-DCL(三)

一.DCL介绍 DCL英文全称是Data Control Language(数据库控制语言),用来管理数据库 用户,控制数据库的访问权限。 二.两个方面 1.数据库可以由那些用户访问 2.可以访问那些内容 三.DCL-管理用户 1.查询用户 USE mysql SELECT * FROM user 2.创建用户 CREATE USER…

Raylib 坐标系

draftx 符号调整为正数 发现采样坐标系原点0&#xff0c;0 在左上角&#xff0c;正方向 右&#xff0c;下 绘制坐标系 原点0&#xff0c;0 在左下角&#xff0c;正方向 右&#xff0c;上 拖拽可得 #include <raylib.h> // 重整原因&#xff1a;解决新函数放大缩小之下…

代码随想录算法训练营第23天|LeetCode 39. 组合总和、40.组合总和II、131.分割回文串

1. LeetCode 39. 组合总和 题目链接&#xff1a;https://leetcode.cn/problems/combination-sum/description/ 文章链接&#xff1a;https://programmercarl.com/0039.组合总和.html 视频链接&#xff1a;https://www.bilibili.com/video/BV1KT4y1M7HJ 思路&#xff1a; 本题和…

【算法笔记自学】第 6 章 C++标准模板库(STL)介绍

6.1vector常见用法详解 #include <cstdio> #include <vector> using namespace std;int main() {int n, x;scanf("%d", &n);vector<int> v;for (int i 0; i < n; i) {scanf("%d", &x);v.push_back(x);}for (int i 0; i <…

方法引用详解

什么是方法引用&#xff1f;&#xff1a;针对于函数式接口中的抽象方法 为什么用方法引用&#xff1f;&#xff1a;避免代码的重复&#xff0c;简便书写&#xff0c;提高效率 在使用Lambda表达式的时候&#xff0c;我们实际上传递进去的代码就是一种解决方案&#xff1a;拿参数…

第15章 奇异值分解:习题解答及其案例

这一章初学建议看该视频学习&#xff0c;讲得歪瑞古德&#xff1a; 《统计学习方法》李航 第15章奇异值分解 1.矩阵的奇异值分解是指将 m n m \times n mn实矩阵 A A A表示为以下三个实矩阵乘积形式的运算 A U Σ V T A U \Sigma V ^ { T } AUΣVT 其中 U U U是 m m m阶正…

文件读写操作之c语言、c++、windows、MFC、Qt

目录 一、前言 二、c语言文件读写 1.写文件 2.读文件 三、c文件读写 1.写文件 2.读文件 四、windows api文件读写 1.写文件 2.读文件 五、MFC文件读写 1.写文件 2.读文件 六、Qt文件读写 1.写文件 2.读文件 七、总结 一、前言 我们在学习过程中&#xff0c…

图像分类-数据驱动方法

K近邻算法&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09; KNN算法通过比较新样本与训练集中的样本的距离&#xff0c;然后根据最近的K个邻居的投票结果来决定新样本的分类。 如图所示&#xff0c;K越大的边界会更加平滑&#xff0c;本质上是根据某一样本最近…

从0到1:培训老师预约小程序开发笔记二

背景调研 培训老师预约小程序&#xff1a; 教师和学生可以更便捷地安排课程&#xff0c;并提升教学质量和学习效果&#xff0c;使之成为管理和提升教学效果的强大工具。培训老师可以在小程序上设置自己的可预约时间&#xff0c;学员可以根据老师的日程安排选择合适的时间进行预…