c++:struct和class的区别

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.mzph.cn/pingmian/41981.shtml

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

相关文章

vue-element-admin搭建步骤

克隆项目 git clone https://github.com/PanJiaChen/vue-admin-template.git进入项目目录 cd vue-admin-template安装依赖 npm install --registryhttps://registry.npm.taobao.org启动服务 npm run dev浏览器访问 http://localhost:9528 发布 构建测试环境 npm run bui…

利用 Hexo 搭建个人博客

〇、前言 本文将会讨论&#xff0c;如何将 CSDN 上的博客&#xff0c;拉取到本地&#xff0c;然后PicGo、Hexo、Github 等工具建立个人博客&#xff0c;环境为 Ubuntu 20.04。 一、利用 Hexo 预备工作 首先安装 Node.js、npm、git工具。 > node -v v12.22.9 > npm -…

《梦醒蝶飞:释放Excel函数与公式的力量》9.1 PMT函数

9.1 PMT函数 PMT函数是Excel中用于计算贷款或投资每期付款金额的函数。它是一个非常实用的财务函数&#xff0c;能够帮助我们快速计算等额本息还款金额。 9.1.1 函数简介 PMT函数用于计算贷款的等额分期付款金额。它根据贷款总额、利率和贷款期数&#xff0c;计算每期需要偿…

大模型日报 2024-07-06

大模型日报 2024-07-06 大模型资讯 ⏩支付宝发布多模态医疗大模型&#xff0c;联合 20 家机构发起医疗 AI 共建计划 支付宝发布多模态医疗大模型&#xff0c;联合 20 家机构发起医疗 AI 共建计划。旨在推动 AI 在医疗领域的创新应用&#xff0c;通过多模态数据整合和分析&#…

解释Handler、Looper和Message Queue在Android中的作用和关系。

在Android开发中&#xff0c;Handler、Looper和Message Queue是处理线程间通信和消息传递的重要组件&#xff0c;它们在异步编程和UI更新方面发挥着至关重要的作用。下面从技术难点、面试官关注点以及回答吸引力三个方面详细解释这些组件的作用和关系。 技术难点 Handler的作用…

vue3使用pinia中的actions,需要调用接口的话

actions&#xff0c;需要调用接口的话&#xff0c;假如页面想要调用actions中的方法获取数据&#xff0c; 必须使用try catch async await 进行包裹&#xff0c;详情看下面代码 import {defineStore} from pinia import {reqCode,reqUserLogin} from ../../api/hospital/i…

Midjourney 预设

使用命令/settings 进入预设,根据点击不同选项来配置。 🌹 1. 设置工作所使用的模型版本。 1️⃣ MJ Version 1 2️⃣ MJ Version 2 3️⃣ MJ Version 3 4️⃣ MJ Version 4 5️⃣ MJ Version 5 5️⃣ MJ Version 5.1 🔧Raw Mode 🌈 Niji Version 4 🍎 Niji Versio…

深入探索C语言中的结构体:定义、特性与应用

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 目录 结构体的介绍结构体定义结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构体的介绍 在C语言中&#xff0c;结构体是一种用户自定义的数据类型&#xff0c;它允许开发者将不同类型的变量组合在一起…

数据库管理工具 -- Navicat Premium v17.0.8 特别版

软件简介 Navicat Premium 是一款功能强大的数据库管理工具&#xff0c;适用于Windows、Mac和Linux平台。它支持多种数据库&#xff0c;包括MySQL、MariaDB、SQL Server、PostgreSQL、Oracle、SQLite等。用户可以通过Navicat Premium轻松地连接到各种数据库服务器&#xff0c;…

ASP.NET Core----基础学习02----中间件的执行顺序 静态文件中间件

文章目录 1.终端中间件&#xff08;Middleware&#xff09;2.中间件的执行顺序&#xff08;1&#xff09;当只有2个中间件的时候&#xff0c;先执行普通中间件&#xff0c;再执行终端中间件&#xff08;2&#xff09;当有多个中间件的时候&#xff0c;中间件的执行顺序 3.添加静…

接口自动化测试思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具&#xff0c;并可以用来“驱动&#xff02;待测应用程序和数据的测试脚本代码&#xff0c;关键字驱动测试看上去与手工测…

Nacos服务注册总流程(源码分析)

文章目录 服务注册NacosClient找看源码入口NacosClient服务注册源码NacosServer处理服务注册 服务注册 服务注册 在线流程图 NacosClient找看源码入口 我们启动一个微服务&#xff0c;引入nacos客户端的依赖 <dependency><groupId>com.alibaba.cloud</groupI…

免密ssh和自定义服务器名字【远程连接服务器】

免密ssh和自定义服务器名字【远程连接服务器】 免密ssh和自定义服务器名字【远程连接服务器】服务器添加本地公钥ssh-copy-id使用别名登录config 免密ssh和自定义服务器名字【远程连接服务器】 原理 实现免密登录需要 本地的公钥id_rsa.pub放在服务器上的 authorized_keys 文件…

Linux 防火墙配置指南:firewalld 端口管理应用案例(二十个实列)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;&#x1f427;Linux高级管理专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️…

Thisjavabean对象数组

This 1.概念 this是一个对象this是一个构造函数 2.介绍 解决局部变量和成员变量命名冲突 this在面向对象-封装那一篇里&#xff0c;有被两个地方提及。 但我们先简单给一个例子&#xff1a; public Person(String name, String phone, String qqPassword, String bankCar…

豆瓣评分9.6,这本书不看损失巨大!

点击上方△腾阳 关注 转载请联系授权 这些年&#xff0c;我就像是个热心向导&#xff0c;逢人就劝读那本《毛泽东选集》。 结果呢&#xff1f;有人一听就摆手&#xff0c;笑言&#xff1a;“哎呀&#xff0c;那书太高大上了&#xff0c;咱啃不动啊&#xff01;” 特别是咱们…

WEB编程-了解Tomcat服务器

第⼀章⽹络编程 1.1 概述 计算机⽹络&#xff1a;是指将地理位置不同的具有独⽴功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在⽹络 操作系统、⽹络管理软件及⽹络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 …

智慧矿山建设规划方案(121页Word)

智慧矿山建设项目方案摘要 一、项目背景及现状分析 项目背景 随着信息技术的迅猛发展&#xff0c;智慧化、数字化已成为矿山行业转型升级的必然趋势。智慧矿山建设项目旨在通过集成先进的信息技术手段&#xff0c;实现对矿山生产、管理、安全等全过程的智能化监控与管理&…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

CP AUTOSAR标准之TimeSyncOverFlexRay(AUTOSAR_CP_SWS_TimeSyncOverFlexRay)(更新中……)

1 简介和功能概述 FrTSyn模块负责处理FlexRay总线上的时间信息分发。   FlexRay机制比CAN机制简单得多,因为它基于这样一个事实,即FlexRay节点彼此同步,否则任何消息都无法在FlexRay上传输。   时间主站和时间从站对FlexRay全局时间的看法相同。因此,只需定义(FlexRay)…