当前位置: 首页 > article >正文

c++primer类详解

类的基本思想是数据抽象和封装。数据抽象是依赖接口和实现分离的编程技术。1. 定义抽象数据类型1.1 设计Sales_data类成员函数的声明必须在类内部定义可以在内部或外部作为接口的非成员函数如print、read声明定义都在类的外部。定义在类内部的函数都是隐式的inline函数调用一个成员函数时隐式初始化this指针任何自定义名为this的参数或者变量都是非法的const成员函数const成员函数在参数列表后加上const关键字的函数const的作用是修改隐式this指针的类型默认情况下this的类型是指向类型非常量的常量指针。因此不能将this绑定在一个非常量对象上(不能把this绑定到其他对象)所以也不能在常量对象上调用普通成员函数不能用const 对象访问普通成员函数。const成员函数提高了函数灵活性常量对象以及常量对象的引用或指针只能调用常量成员函数。编译器分两步处理类。1.编译成员声明。2.所有成员声明编译完后编译成员函数体。因此成员声明出现在成员函数体后编译器也可以正常编译在类外定义函数体需要在函数名前加上类名::在类名之后剩余的代码位于作用域之内若返回类型也是在类内声明的就需要在函数名和返回类型前都加上类名::。若在类内声明成了const成员函数在外部定义时const关键字也不能省略。若需要返回类本身使用return *this1.2 定义类相关的非成员函数类相关非成员函数属于类的接口但是不属于类本身。通常把函数声明和定义分开。和类声明在同一头文件内。通常情况下拷贝一个类其实是拷贝其成员。若想拷贝执行其他操作查阅拷贝赋值函数12Sale_data s1;Sale_data s2s1;//s2拷贝了s1的成员1.3构造函数构造函数的任务是初始化类对象的数据成员只要类对象被创建一定会执行构造函数构造函数名与类名相同并且没有返回类型其他与普通函数相同。构造函数不能声明成const默认构造函数默认构造函数无需任何实参若没有为类显式定义任何构造函数编译器隐式构造一个合成的默认构造函数。合成的默认构造函数按照如下规则初始化类成员若存在类内初始值用它来初始化成员否则默认初始化成员某些类不能依赖合成的默认构造函数若类包含内置类型或复合类型成员只有当这些值全被赋予了类内初始值时这个类才适合使用合成的默认构造函数。若类a包含一个成员类b若b没有默认构造函数则编译器无法为a构造正确的默认构造函数若定义了其他构造函数则编译器不会构造默认初始函数1234567classA{//定义了一个实参为string的构造函数//此时编译器不会合成默认构造函数A(std::string a){}}A a;//错误没有默认构造函数A a1(std::string(小黑));//只能用string参数参数列表后加上 defualt表示要求编译器生成默认构造函数defualt可以和声明一起出现在类内也可以作为定义出现在类外。若在类内部则默认构造函数时内联的若在类外部默认不是内联的。1234classA{A()defualt;}A a;//正确编译器生成默认构造函数构造函数初始值列表存在编译器不支持类内初始值这样的话默认构造函数不适用因为默认构造函数使用类内初始值初始化类成员这时应该使用构造函数初始值列表。函数初始值列表是参数列表如下所示冒号以及冒号和花括号间的代码::bookNo(s)构造函数不应该轻易覆盖掉类内初始值除非新赋的值与原值不同在构造函数的过程中没有出现在函数初始化列表中的成员将被执行默认初始化1234567classSales_data{Sales_data(conststd::string s,unsigned n,doublep):bookNo(s),units_sold(n),revenue(p*n){}//当编译器不支持类内初始值时可用如下方法定义Sales_data(conststd::string s):bookNo(s),units_sold(0),revenue(0){}}在类外部定义构造函数,要声明是哪个类的构造函数在函数名前加上类名::123Sales_data::Sales_data(std::istream cin){read(cin,*this);}1.4 拷贝、赋值和析构编译器会为类合成拷贝、赋值和销毁操作。编译器生成的版本对对象的每个成员执行拷贝、赋值和销毁操作2 访问控制和封装访问说明符public说明符后的成员在整个程序内可以被访问private说明符后的成员可以被类的成员函数访问一个类可以包含0个或多个访问说明符有效范围到下一个说明符出现为止。class和struct关键字定义类的唯一区别是class在第一个访问说明符出现之前的区域默认是privatestruct在第一个访问说明符出现之前的区域默认是public2.1 友元类可以允许其他类或函数访问他的非公有成员。方法是用关键字friend声明友元。友元的声明只能在类内部友元声明的位置不限最好在类定义开始或结束前集中声明友元。封装的好处确保用户代码不会无意间破坏封装对象的状态被封装的类的具体实现细节可以随时改变友元在类内的声明仅仅指定了访问权限并不是一个通常意义的函数声明若希望类的用户能够调用某个友元函数需要在友元声明之外再专门对函数进行一次声明为了使友元对类用户可见友元声明与类本身防止在同一个头文件中一些编译器强制限定友元函数必须在使用之前在类的外部声明2.2 类的其他特性接下来介绍类型成员、类的成员的类内初始值、可变数据成员、内联成员函数、从成员函数返回*this、如何定义使用类类型、友元类2.2.1 类成员再探类别名类型成员在类中定义的类型名字和其他成员一样存在访问限制可以是public或者private类别名必须先定义后使用回忆类成员变量可以在类成员函数之后定义但是在类函数中使用原因是编译器先编译类成员变量后边一类成员函数类型成员通常出现在类开始的地方12345classScreen{public://等价于 using pos std::string::size_typetypedefstd::string::size_type pos;}令成员作为内联函数定义在类内部的函数是自动inline的定义在类外部的函数若需要声明内联函数要加上inline;inline成员函数也应该和相应的类定义在同一个头文件夹123456inlineScreen Screen::move(pos r,pos c){pos row r*width;cursor row c;return*this;}可变数据成员永远不会是const即使他是const对象的成员12345678classScreen{publicvoidsome_member()const;private:mutablesize_taccess_ctr;//使用mutable声明可变数据成员}voidScreen::some_member()const{access_ctr;//即使在const成员函数中仍然可以修改可变数据成员}类内初始值使用的初始化形式或者花括号括起来的直接初始化形式2.2.2 返回*this的成员函数注意返回类型是否是引用。是否是引用对函数的使用方法影响很大123456789101112inlineScreen Screen::set(charch){content[cursor] ch;return*this;}inlineScreen Screen ::move(pos r,pos col){cursor r * width col ;return*this;}Screen s(3,2,);//move函数返回s本身所以可以接着调用set函数//并且move函数返回的是Screen的引用若返回的不是引用则会返回一个新的Screen对象s.move(3,2).set(!);从const函数返回的是常量引用在const函数中无法修改类成员变量使用const函数进行重载编写函数display打印Screen中的contents因为只是展示不需要修改值所以这应该是一个const函数。但是希望实现在展示后能移动光标s.display().move(2,3)。这要求display返回的值是可以修改的所以这不应该是const函数。基于const重载可以根据Screen对象是否是const来进行重载。建议多使用do_display这类函数完成实际工作使公共代码使用私有函数可以集中修改没有额外开销123456789101112131415161718192021classScreen{public:Screen* display(std::ostream os){do_display(os);return*this;}constScreen* display(std::ostream os)const{do_display(os);return*this;}private:voiddo_display(std::ostream os)const{oscontent;}}intmain(){constScreen cs(3,3,!);Screen s(3,3,.)cs.display();//因为cs是const的调用第二个const函数s.display();//调用第一个非const的函数}2.2.3 类类型每个类定义了唯一的类型即使成员完全相同也是不一样的类。12345678classA{intmember;}classB{intmember;}A a;B b a;//错误不完全类型类似于函数类也可以只声明不定义,这被叫做不完全类型不完全类型是向程序说明这是一个类名不完全类型使用环境很有限只是可以定义指向这种类型的指针或引用声明但不能定义以不完全类型作为参数或返回类型的函数。类在创建前必须被定义类的成员不能有类本身除了后面介绍的static类但是可以是指向自身的引用或指针2.2.4 友元再探一个类制定了其友元类则友元函数可以访问该类的所有成员友元关系不存在传递性每个类自己负责控制自己的友元类或友元函数定义友元函数的顺序有一个screen类有私有成员content有clear函数可以清除content的内容。1.先声明clear函数2.在screen类中将clear函数函数定义为友元函数3.定义clear函数使用screen类定义友元类有类windowwindow有私有成员content友元类 window_mgr需要直接操作content。正常编写window类在window类中声明friend class window_mgr正常编写 window_mgr类可以直接使用window的content注意将类写在头文件中要按照如下格式否则编译会报错重复的类定义1234#ifndef xxx_H#define xxx_H/class定义///#endif一个类想把一组重载函数定义为它的友元需要对这组函数中的每一个进行友元声明。友元声明仅仅表示对友元关系的声明但并不表示友元这个函数本身的声明12345678910structX{friendviod f(){/*友元函数可以定义在类的内部但是我认为这样没有意义*/X(){f();}//错误f还没有被定义voidg();voidh();}voidX::g(){returnf();}//错误f还没有被定义voidf();voidX::h(){returnf();}//正确f的声明已经在定义中了};2.4 类的作用域定义在类外的方法需要在方法名前使用::说明该方法属于哪一个类在说明属于的类后该函数的作用域位于该类内。即返回类型使用的名字位于类的作用域之外。若返回类型也是类的成员需要在返回类型前使用::指明返回类型属于的类12345//pos的类型声明在window类中并且返回类型在类的作用域外因此要使用window::poswindow::pos window::get_pos(){//在window::get_pos后的所有代码作用域在类内所以返回cursor相当于this-cursorreturncursor;}2.4.1 名字查找和类的作用域类的定义分两步处理1.编译成员的声明2.直到类成员全部可见后编译函数体一般来说内层作用域可以重新定义外层作用域名字但在类中若使用了某个外层作用域中的名字并且该名字表示一种类型则类不能在之后重新定义该名字

相关文章:

c++primer类详解

类的基本思想是数据抽象和封装。 数据抽象是依赖接口和实现分离的编程技术。 1. 定义抽象数据类型 1.1 设计Sales_data类 成员函数的声明必须在类内部,定义可以在内部或外部作为接口的非成员函数,如print、read,声明定义都在类的外部。定义…...

如何用SQL快速获取上个月的对比数据_LAG函数应用

LAG函数无法直接获取上月数据,因其按行序而非自然月偏移;需先用generate_series或递归CTE补全连续月份,再对归一化月字段开窗计算。LAG 函数为什么拿不到上个月数据直接用 LAG 按行偏移,不等于按「自然月」偏移。它只看当前结果集…...

C/C++中组合详解及其作用介绍

组合 (Composition) 指在一个类中另一类的对象作为数据成员. 案例 在平面上两点连成一条直线, 求直线的长度和直线中点的坐标. 要求: 基类: Dot派生类: Line (同时组合)派生类 Line 从基类 Dot 继承的 Dot 数据, 存放直线的中点坐标Line 类再增加两个 Dot 对象, 分别存放两个…...

Linux磁盘明明有空间,却报‘No space left on device’?手把手教你排查inode耗尽问题

Linux磁盘空间充足却报"No space left on device"?深入解析inode耗尽问题 1. 问题现象与初步排查 当你看到"No space left on device"这个错误时,第一反应通常是检查磁盘空间。在Linux系统中,我们习惯使用df -h命令&…...

小白程序员必看:收藏这份智能体工程指南,轻松驾驭大模型生产难题!

智能体工程是将非确定性大语言模型系统化为可靠生产体验的迭代过程。文章强调智能体工程结合了产品思维、工程开发和数据科学,通过构建、测试、发布、观察、改进的循环提升智能体可靠性。成功案例如Clay、LinkedIn等展示了智能体工程的重要性,并提出了实…...

毫米波雷达智能家居传感器:RoomSense IQ技术解析

1. RoomSense IQ 模块化房间监测器深度解析在智能家居领域,人体存在检测一直是个技术难点。传统方案如红外传感器只能检测运动,而无法判断静止的人体;摄像头又涉及隐私问题。RoomSense IQ通过毫米波雷达技术解决了这一痛点,配合ES…...

【技术应用】PLA技术“点亮”蛋白互作,破解动脉粥样硬化新机制!

动脉粥样硬化是心梗、脑梗的元凶。科学家发现,血管分叉处受“扰动血流”冲击的内皮细胞特别容易发炎、长斑块。但背后的分子“推手”是谁?最新发表在《Circulation》的研究给出了答案:一个叫DAPK2的激酶,并首次用邻近连接&#xf…...

ARM MPAMSM_EL1寄存器解析与资源隔离技术

1. ARM MPAMSM_EL1寄存器深度解析在ARMv9架构中,内存分区与监控(MPAM)技术为系统资源隔离和性能监控提供了硬件级支持。作为MPAM机制的核心组件,MPAMSM_EL1(Memory Partitioning and Monitoring Streaming Mode Register)专为流式…...

制造企业拍宣传片,怎么选到懂行业、能落地、带转化的传媒公司?

制造业的招商宣传片,跟普通的企业形象片有所不同。它不能全靠拍风景、拍大楼、拍开会的表意处理。它需要具象、直白的展示为合作伙伴描绘可期的商业前景,向终端客户传递稳固的品牌信赖感,最终促成高价值的商业链接。作为一家在河北扎根9年&am…...

机器学习消防水力系统故障诊断应用【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)Simscape机电液耦合仿真平台与故障注入方法&#x…...

TotalDMIS2026两圆最佳拟合圆柱

在TOTALDMIS软件中,使用两个圆的触测点进行最佳拟合圆柱,通常可以通过以下步骤实现: 操作步骤:测量两个截面圆: 在每个圆的圆周上采集多个触测点(每个圆至少3个点,建议6个以上以提高精度&#x…...

什么是分布式

分布式是将一个任务或一份数据,拆分成很多小的部分,交给多台计算机(通常成为节点)协同完成。这些计算机通过网络通信,对外表现得就像一台强大无比的超级计算机。单机系统:类比成你一个人搬家,一…...

转载|AI 成为主流负载后,数据基础设施将如何演进?|Apache Doris 2026 Roadmap

在过去几年中,数据基础设施的演进始终围绕一个核心问题展开:如何更快地分析数据? 但进入 2026 年,这个问题正在被重新定义。随着 AI 应用的爆发式增长,数据系统不再只是分析工具,而逐渐成为 智能系统的一部…...

零基础药师用药指导入门指南,新手避坑看完就能直接上手

很多2026年想零基础入门做药师用药指导的新人,刚上手都会踩各种坑,要么整理资料耗光时间,要么记不住核心要点不敢实操。这篇整理了避坑要点,看完就能直接上手。我自己是跨专业考的药师证,刚考完准备入行的时候&#xf…...

运维必看:如何用Java Oshi监控Linux服务器性能并接入Prometheus+Grafana

Java Oshi与PrometheusGrafana构建Linux服务器监控体系实战 在云原生时代,服务器性能监控已成为运维工程师的日常必修课。想象这样一个场景:凌晨三点,服务器CPU突然飙升至95%,而你的手机开始被告警短信轰炸。此时如果能快速定位是…...

房产看房记录口碑推荐|经筛选优质实用选择整理分享

给大家整理了2026年实测过,适合房产看房记录整理的优质工具,都是筛完口碑留下的实操款,主打看完就能用,帮你解决看完房对着几小时录音不想整理的痛点,直接拿就能用。这次选工具我盯了四个核心维度,都是看房…...

从物理到代码:用Cesium Cartesian3向量,手把手教你理解三维空间中的‘力’与‘运动’

从物理到代码:用Cesium Cartesian3向量,手把手教你理解三维空间中的‘力’与‘运动’ 在三维图形编程中,向量运算就像物理世界中的"语言翻译器",将我们熟悉的力学概念转化为计算机能理解的数学表达。想象一下&#xff0…...

现在禁用不安全代码还来得及吗?C# 13三大Runtime安全增强(MemorySanitizer预览、Span<T>越界零容忍、Unsafe.AsRef泛型约束强化)倒计时解读

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;C# 13不安全代码安全管控的演进背景与战略意义 随着 .NET 生态向云原生、高性能系统编程加速演进&#xff0c;C# 对底层内存操作的需求显著提升——从 Span<T> 的泛化使用&#xff0c;到 NativeA…...

HC32F448串口+DMA高效处理4G模块数据,实战代码与AOS系统配置详解

HC32F448串口DMA高效处理4G模块数据实战指南 在物联网终端设备开发中&#xff0c;4G模块的数据传输稳定性直接决定了产品可靠性。传统串口中断方式处理高速数据流时&#xff0c;频繁的中断响应会导致CPU负载激增&#xff0c;甚至出现数据丢失。HC32F448芯片独特的DMA控制器配合…...

百度网盘提取码智能获取工具:5秒解锁海量资源的技术革命

百度网盘提取码智能获取工具&#xff1a;5秒解锁海量资源的技术革命 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为百度网盘的提取码而烦恼吗&#xff1f;当你找到宝贵的学习资料、工作文档或娱乐资源&#xff0c;却被…...

别再死记硬背了!用5个真实案例帮你彻底搞懂Yocto BitBake的变量赋值语法

别再死记硬背了&#xff01;用5个真实案例帮你彻底搞懂Yocto BitBake的变量赋值语法 第一次接触Yocto的BitBake语法时&#xff0c;很多人都会被各种变量赋值操作符搞得晕头转向。、?、、.、:append...这些看似简单的符号背后&#xff0c;隐藏着变量展开时机、覆盖规则等复杂逻…...

混合信号验证:SystemVerilog与Verilog-AMS协同架构实践

1. 混合信号验证的现状与挑战在当今SoC设计领域&#xff0c;混合信号电路已成为主流配置。我参与过多个包含复杂ADC/DAC模块的芯片验证项目&#xff0c;深刻体会到传统验证方法的局限性。随着工艺节点不断下探至7nm甚至更低&#xff0c;模拟与数字电路的交互复杂度呈指数级增长…...

ARM异常处理与SMC指令陷阱机制详解

1. ARM异常处理机制概述在ARMv8/v9架构中&#xff0c;异常处理是系统可靠性和安全性的基石。当处理器遇到意外事件&#xff08;如指令执行错误、外部中断、系统调用等&#xff09;时&#xff0c;会暂停当前程序流&#xff0c;转而去执行预先定义好的异常处理程序。这种机制不仅…...

Bootstrap4 折叠

Bootstrap4 折叠&#xff08;Collapse&#xff09;学习笔记 一、基本概念 折叠组件&#xff08;Collapse&#xff09;用于内容的显示/隐藏切换&#xff0c;常用于手风琴、FAQ 面板等场景。核心机制是通过 data-* 属性或 JavaScript 控制元素的展开与收起。 二、基本用法 1.…...

新手应该怎样选择第一把琴?尤克里里入门推荐攻略一次讲清

很多想尝试学习乐器的朋友都会把尤克里里当做入门之选&#xff0c;但在学琴前&#xff0c;大部份人都会被“如何选择第一把琴”难住。市面上太多五花八门的品牌和型号&#xff0c;各种尺寸、材质让人眼花缭乱&#xff0c;选贵了怕浪费&#xff0c;选便宜的怕踩雷。尤克里里入门…...

【含最新安装包】零基础部署|OpenClaw 2.6.6|Windows 可视化一键配置

零基础部署 OpenClaw 2.6.6&#x1f4cc;Windows 可视化一键配置 核心亮点&#xff1a;全程可视化&#xff5c;零代码门槛&#xff5c;无需手动配环境&#xff5c;内置所有依赖 下载地址&#xff1a;https://xiake.yun/api/download/package/6?promoCodeIVF12ADA450A 文件大…...

大模型 Agent 的“记忆”,到底应该怎么设计?

本文解读的是论文 《Memory in the LLM Era: Modular Architectures and Strategies in a Unified Framework》&#xff0c;这篇论文讨论的不是“让模型上下文窗口继续变长”这么简单的问题&#xff0c;而是试图回答一个更接近 Agent 落地的核心问题&#xff1a;当大模型需要跨…...

【VS Code Dev Containers 成本优化白皮书】:20年云原生架构师亲授5大可落地的资源节流策略

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Dev Containers 成本优化的底层逻辑与价值认知 Dev Containers 并非仅是开发环境的“容器化封装”&#xff0c;其核心成本优化逻辑植根于资源隔离粒度、生命周期可控性与基础设施复用率三重机制。传统虚…...

泛微OA中如何实现,将选中的明细行数据内容,传送给其他系统或是单独存放

前言 近期有个需求:用户提出,他们需要在当前节点去勾选对应明细行的内容,然后将这个明细行里面的最新数据更新到SAP中,能做到一个实时更新的效果 这个需求也就相当于是用户想做到一个能实时更新的一个效果,但是因为泛微OA一些基础的数据更新要么靠jsp文件去更新,要么就…...

声定向系统改良设计——大功率集成化声频定向扬声器系统

声定向系统改良设计——大功率集成化声频定向扬声器系统 摘要 声频定向扬声器系统是一种利用超声波在空气中的非线性传播效应产生高指向性可听声的新型声学设备。针对原有系统在输出功率不足、模块分立程度高、系统集成度低等方面存在的问题,本文提出了一套完整的改良设计方…...