C++小知识记录,不定时更新

1. 普通函数不能在头文件中定义:

当多个.cpp调用时,在编译链接时会在.o文件中重复定义报错


2. 为什么内联函数可以在头文件中定义:适用短小函数

当.cpp调用时,编译器只会在当前文件展开该函数,相当于每个.cpp会重新定义该函数,不会在.o文件中生成该函数的符号


3. 为什么模版函数必须在头文件中定义:

  • 模板函数的定义实际上是一个“模板”或“蓝图,它并没有真正生成代码,直到你使用它。
  • 当你在某个 .cpp 文件中 调用模板函数 时,编译器会根据传入的类型 实例化 这个模板函数。
  • 实例化过程 会生成一个具体类型的函数实现,比如 “add(int,int)” 或 “add(double,double)”。
  • 模板实例化 是编译器在遇到模板调用时才进行的,编译器需要看到函数模板的定义才能生成相应的代码。
  • 如果你将模板函数的定义放在了 .cpp 文件中,那么其他 .cpp 文件调用时,编译器并不会看到模板的定义,从而 无法实例化,就会导致链接错误。

4. 动态库和静态库导出不同,动态库导出必须要导出.lib的符号文件,此时的.lib并不是静态库,而是包含着符号定义的导出库,函数名、变量名等。


5. 指针常量,常量指针的区别:

  • 常量指针: int const *p 或者const int p; 表示指针所指向的对象不能被修改,但是指针本身可以被赋值其他地址,也就是说p不能被修改
  • 指针常量: int* const p; 表示指针是常量,其不能被修改,但是指针指向的对象能被修改,主要看const作用在什么上
  • const int* const p; 第一个const 防止*P被修改,第二个const防止p被修改

6. 函数指针和指针函数:

函数指针:本质是指针,只是指针指向的是某个函数名 int (*f)(int a, int b); f是一个指向返回为int,有两个参数也是int的指针
指针函数:本质是函数,返回类型是指针int *f(int a, int b);


7. inline 函数,关键字inline ,在编译的时候将代码副本放置到每个函数调用的地方,提高计算效率,但是增加体量,内联函数越小越有优势


8. 定位符new, int *p = new(&a) int; 意思是在已有地址a上开辟一块内存,因此不需要使用delete释放

  • new是放在堆上的,需要delete释放,属于动态内存分配

9. namespace: 防止多个文件命名冲突,比如头文件1和2都定义了value变量,但是main函数调用的时候就不知道是哪个文件

  • 有名的 如namespace nn{}
  • 无名 namespace{}
  • 有名可以被其他调用,无名只能本文件调用,相当于static

10. 模版函数,比如两个变量实现交换,参数可以是任何类型,这是就需要模板来解决,template f, T可以是任务类型,传参的时候,类型确定即可;


11. 类的构造函数,在类实例化会被调用,用于初始化成员数据


12. 类的私有数据不能再外部通过实例来调用,但是类的成员函数可以赋值修改调用私有数据


13. *this 指向对象自己,每一个类中都有一个this指针指向对象自己,*this就是对象自身的引用,因为this就本来就是对象自己


14. const Stock &Stock::topval(const Stock &s) const;

  • 第一个const 修饰的是topval,表示函数中不能修改任何类中的数据
  • 第二个const 修饰的是s, 表示s的引用不能被修改
  • 第三个const 修饰的是返回值,表示返回的对象也必须是const常量

15. 类中的友元函数在类中声明,但不是类的成员函数,因此不能用::调用,但是和类的成员函数是一样的,可以调用类中的数据和函数


16. 只有static成员数据才可以在外部定义,其他成员数据不可以在内部和外部定义,指定通过构造函数来初始化。


17. C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数

  • 主要区别,深拷贝重新生成一块内存来存储,而浅copy只是简单的赋值,当成员中存在指针,则浅copy指向两个相同的地方,析构会导致指针悬挂。
  • 拷贝(复制)构造函数只有一个参数,而且必须是当前类的引用,不然会陷入死循环
  • 用类的一个对象去初始化另外一个类的时候会用到
  • 深copy通过重载运算符实现,通过删除原有指针空间并使用new创建新的指针空间来实现

18. 智能指针:

  • 如auto_ptr,其实是一类模版类,用于防止内存泄漏,后来被unique_ptr 取代了 C++11使用这个而不是auto_ptr ,shared_ptr也可以使用
    如atuo_ptr str(new )

19. 虚函数 和纯虚函数

  • virtual 和 pure virtual
  • 虚函数是为了基类和派生类中的同名函数而定义的,目的是派生类可以修改这个函数定义,基类和派生类可通过指针和引用调用

**有错请指正


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开箱即用的.NET MAUI组件库 V-Control 发布了!

之前写过挺多的MAUI Sample,其中有很多代码可以打包成组件,当组件完善到一定程度,我会把控件封装起来放到控件库中。 今天,在这个仓库建立一年零八个月后,我觉得可以考虑将其作为开源库发布。 有很多网友在观望.NET …

Qt:项目文件解析

目录 QWidget基础项目文件解析 .pro文件解析 widget.h文件解析 widget.cpp文件解析 widget.ui文件解析 main.cpp文件解析 认识对象模型 窗口坐标系 QWidget基础项目文件解析 .pro文件解析 工程新建好之后,在工程目录列表中有⼀个后缀为 ".pro" …

装备库室管控系统|支持国产化、自主研发

装备库室管控系统(DW-S306)利用现有内部网络,部署综合管理系统,形成一套上下统一、功能完善的管理体系,建设一个功能完善、规范有序为目标,实现可视化监管、数字化军械管理、安全监管于一体的物联网信息化管…

软件测试就业

文章目录 2.6 初识一、软件测试理论二、软件的生产过程三、软件测试概述四、软件测试目的五、软件开发与软件测试的区别?六、学习内容 2.7 理解一、软件测试的定义二、软件测试的生命周期三、软件测试的原则四、软件测试分类五、软件的开发与测试模型1.软件开发模型…

【Java基础】序列化、反序列化和不可变类

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java基础面经 📚本系列文章为个…

upx压缩工具使用说明

UPX(Ultimate Packer for Executables)是一款开源的可执行文件打包工具,能够将可执行文件(如Windows的.exe文件或Linux的ELF文件)进行压缩,以减少文件大小,并增加反逆向工程的难度。 下载相关安…

DeepSeek-R1 32B Windows+docker本地部署

最近国产大模型DeepSeek兴起,本地部署了一套deepseek同时集成Open WebUI界面,给大家出一期教程。 软件:Ollama、docker、Open WebUI 一、用Ollama下载模型 首先我们需要安装Ollama,它可以在本地运行和管理大模型。 到Ollama官网 https://ol…

活动预告 |【Part 2】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁

课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动,了解如何更好地在 Microsoft 365 Defen…

(2024|CVPR,MLLM 幻觉)OPERA:通过过度信任惩罚和回顾分配缓解多模态大型语言模型中的幻觉

OPERA: Alleviating Hallucination in Multi-Modal Large Language Models via Over-Trust Penalty and Retrospection-Allocation 目录 1. 引言 2. 相关研究 2.1 多模态大语言模型 2.2 LLM 的幻觉与解决方案 2.3. 语言模型中的解码策略 3. 方法 3.1 MLLM 生成过程 3.2…

激活函数篇 03 —— ReLU、LeakyReLU、ELU

本篇文章收录于专栏【机器学习】 以下是激活函数系列的相关的所有内容: 一文搞懂激活函数在神经网络中的关键作用 逻辑回归:Sigmoid函数在分类问题中的应用 整流线性单位函数(Rectified Linear Unit, ReLU),又称修正线性单元&a…

C++20新特性

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 C20 是 C 标准中的一个重要版本,引入了许多新特性和改进,包括模块(Modules)、协程…

新增md、html压缩文档上传,开放接口访问密钥改为多个,zyplayer-doc 2.4.7 发布啦!

zyplayer-doc是一款适合企业和个人使用的WIKI知识库管理工具,支持在线编辑富文本、Markdown、表格、Office文档、API接口、思维导图、Drawio以及任意的文本文件,专为私有化部署而设计,最大程度上保证企业或个人的数据安全,支持以内…

ES管理器焕新升级:紫色银狼主题来袭!

ES管理器(安卓版)迎来了一次令人眼前一亮的改头换面!此次更新最直观的变化集中在UI界面设计上。开发团队大胆突破,摒弃了以往稍显平庸的风格,引入了极具个性的全新主题——以热门游戏《崩坏:星穹铁道》中的…

SwiftUI 学习 Toggle 遇到的问题

最近学习SwifyUI,心中存疑,于是记录这些问题 List {Toggle(isOn: $showFavoriteOnly) {Text("Favorite only")}ForEach(filterLandmarks) { landmark in// 在 NavigationLink 中,label 是用于指定导航链接显示内容的部分Navigati…

HarmonyOS:电话号码格式化

一、使用场景 不同国家和地区的电话号码在号码位数、组合方式、呈现方式等都存在差异。同时,在不同环境和条件下,电话号码可能存在不同的拨打方式和号码格式。例如,在中国境内跨地区打电话,通常需要先输入“0”,再拨打…

网络分析工具—WireShark的安装及使用

Wireshark 是一个广泛使用的网络协议分析工具,常被网络管理员、开发人员和安全专家用来捕获和分析网络数据包。它支持多种网络协议,能够帮助用户深入理解网络流量、诊断网络问题以及进行安全分析。 Wireshark 的主要功能 数据包捕获与分析: …

优惠券平台(十七):实现用户查询/取消优惠券预约提醒功能

业务背景 当用户预约了一个或多个优惠券抢购提醒后,如果不再需要提醒,可以取消预约通知。不过,虽然用户可以取消提醒,但已经发送到 MQ 的消息不会被撤回,消费者在时间点到达时依然会收到消息。此时,我们不…

10vue3实战-----实现登录的基本功能

10vue3实战-----实现登录的基本功能 1.基本页面的搭建2.账号登录的验证规则配置3.点击登录按钮4.表单的校验5.账号的登录逻辑和登录状态保存6.定义IAccount对象类型 1.基本页面的搭建 大概需要搭建成这样子的页面: 具体的搭建界面就不多讲。各个项目都有自己的登录界面&#…

盘姬工具箱:完全免费的电脑工具箱

今天给大家介绍一个非常好用的系统工具箱,里面内含100多个工具,完全免费使用,而且没有广告,非常的棒。 盘姬工具箱:完全免费的电脑工具箱 盘姬工具箱是一款完全免费的电脑工具箱,功能丰富且实用。软件下载并…

国产编辑器EverEdit - 编辑辅助功能介绍

1 编辑辅助功能 1.1 各编辑辅助选项说明 1.1.1 行号 打开该选项时,在编辑器主窗口左侧显示行号,如下图所示: 1.1.2 文档地图 打开该选项时,在编辑器主窗口右侧靠近垂直滚动条的地方显示代码的缩略图,如下图所示&…