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

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
  • 虚函数是为了基类和派生类中的同名函数而定义的,目的是派生类可以修改这个函数定义,基类和派生类可通过指针和引用调用

**有错请指正


相关文章:

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

1. 普通函数不能在头文件中定义: 当多个.cpp调用时,在编译链接时会在.o文件中重复定义报错 2. 为什么内联函数可以在头文件中定义:适用短小函数 当.cpp调用时,编译器只会在当前文件展开该函数,相当于每个.cpp会重新定…...

python--sqlite

1. 连接到数据库 使用 sqlite3.connect() 方法可以创建一个到SQLite数据库的连接。如果指定的数据库文件不存在,它会自动创建一个新的数据库文件。 import sqlite3# 连接到数据库,如果数据库文件不存在则会创建一个新的 conn sqlite3.connect(example…...

使用 Axios ——个人信息修改与提示框实现

目录 详细介绍:个人信息设置与修改页面实现 1. HTML 结构 2. CSS 样式 3. JavaScript 核心逻辑 a. 信息渲染与表单提交 b. 头像上传与预览 4. 功能详解 5. 总结 提示: 这段代码展示了如何创建一个简单的个人信息设置页面,包含用户个…...

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包,下载地址:https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象,点击新增,从文件添加 点击启动 可根据情况,进行高级设置,没有就下一步 点击应…...

LabVIEW商业软件开发

在商业软件开发和仪器自动测试领域,LabVIEW以其图形化编程方式、高效的数据采集能力和强大的硬件集成优势,成为众多工程项目的核心开发工具。然而,商业软件的开发远不止编写代码和实现功能那么简单,尤其是在仪器自动测试领域&…...

内容中台赋能人工智能技术提升业务创新能力

内容概要 在当今快速变化的市场环境中,企业需要不断寻求创新以保持竞争力。内容中台作为一种新型的内容管理架构,能够极大地提升企业在内容创建、管理和分发方面的效率。通过与人工智能技术的深度融合,企业能够将海量的数据和信息转化为有价…...

spring 基于构造方法实例化对象

在 spring 中,对象的实例化创建都在 AbstractAutowireCapableBeanFactory#createBeanInstance 方法中完成,其中定义了不少实例化策略,如:Supplier、工厂方法、构造方法、无参构造。其中无参构造,即 AbstractAutowireCa…...

生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 下

生成式聊天机器人 -- 基于Pytorch Global Attention 双向 GRU 实现的SeqToSeq模型 -- 下 训练Masked 损失单次训练过程迭代训练过程 测试贪心解码(Greedy decoding)算法实现对话函数 训练和测试模型完整代码 生成式聊天机器人 – 基于Pytorch Global Attention 双向 GRU 实…...

Vue.js 与第三方插件的集成

Vue.js 与第三方插件的集成 今天我们来聊聊如何在 Vue 项目中集成第三方插件。随着项目功能不断增多,我们常常需要引入各种第三方库和插件,比如国际化、图表、日期处理等,来提升开发效率和用户体验。下面就跟大家分享一下集成第三方插件的常…...

Netty初学九 心跳与空闲检测

一、网络问题 1.连接假死: 连接假死的现象是:在某一端看来,底层的Tcp连接已经断开,但是应用程序没有捕获到,会认为这条连接仍然是存在的。从TCP层面来说,只有收到四次握手数据包或者一个RST数据包才可以表示…...

数据分析如何做EDA

探索性数据分析(EDA,Exploratory Data Analysis)是数据分析过程中至关重要的一步,其目的是通过统计和可视化技术对数据进行初步分析,从而揭示数据的潜在模式、特征和异常值,并为后续的数据预处理、特征工程…...

AD域控粗略了解

一、前提 转眼大四,目前已入职上饶一公司从事运维工程师,这与我之前干的开发有着很大的差异,也学习到了许多新的知识。今天就写下我对于运维工作中常用的功能——域控的理解。 二、为什么要有域控,即域控的作用 首先我们必须要…...

【计算机网络】TCP/IP 网络模型有哪几层?

目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型? 对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通…...

使用 Typora 编写 MD 文档:从入门到精通(附赠百度网盘下载地址)

引言 Markdown(简称 MD)是一种轻量级标记语言,广泛应用于技术写作、博客撰写、文档管理等领域。Typora 是一款功能强大且易于使用的 Markdown 编辑器,支持实时预览、语法高亮、主题切换等功能,深受开发者和写作者的喜…...

Spring统一修改RequestBody

我们编写RestController时,有可能多个接口使用了相同的RequestBody,在一些场景下需求修改传入的RequestBody的值,如果是每个controller中都去修改,代码会比较繁琐,最好的方式是在一个地方统一修改,比如将he…...

【Flink实战】Flink -C实现类路径配置与实现UDF Jar

文章目录 1. 描述2. 使用语法3. -C 适用的 Flink 运行模式4. USING JAR 不可用 1. 描述 Flink 中的 -C 选项用于将 URL 添加到作业的类加载器中。URL可以指向本地、HTTP 服务器或 HDFS 等资源的Jar文件。 注意: 此处的classpath的url必须是一个能够在client&…...

DevOps的个人学习

一、DevOps介绍 软件开发最初是由两个团队组成: 开发团队:负责设计和构建系统。运维团队:负责测试代码后部署上线,确保系统稳定安全运行。 这两个看似目标不同的团队需要协同完成一个软件的开发。DevOps整合了开发与运维团队&a…...

【东莞常平】戴尔R710服务器不开机维修分享

1:2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机,于是经老客户介绍找到我们。 2:服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3:客户反馈的故障问题为:…...

STM32自学记录(八)

STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表,把引脚的电压值测出来,放在一个变量里。 ADC:模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…...

【Java八股】JVM

JVM 1. jvm内存区域分为哪些部分 线程私有的:程序计数器、虚拟机栈、本地方法栈 程序计数器:指示当前线程执行到的字节码文件的行号,是线程切换后保证线程能恢复到正确的执行位置的关键 虚拟机栈:用于存储方法调用的数据&…...

Citespace之关键词爆发检测分析(进阶分析)

在开始citespace进行关键词爆发检测分析之前,如果不会使用citespace的,可以参考我之前这一篇博客: https://blog.csdn.net/m0_56184997/article/details/145536095?spm1001.2014.3001.5501 一、创建工程后进行设置 在创建好工程后&#xf…...

解锁 DeepSeek 模型高效部署密码:蓝耘平台深度剖析与实战应用

💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

一周发生AI事件总结(02.08)

本周人工智能领域发生的所有事件: Ilya Sutskever的初创公司正洽谈以约200亿美元估值进行融资:据路透社报道,由前OpenAI首席科学家Ilya Sutskever创立的人工智能初创公司Safe Superintelligence正洽谈以“至少”200亿美元的估值进行融资。该…...

NIO——网络编程

文章目录 非阻塞 vs 阻塞阻塞非阻塞多路复用 Selector好处创建绑定 Channel 事件监听 Channel 事件select 何时不阻塞 💡处理 accept 事件事件发生后能否不处理💡 处理 read 事件为何要 iter.remove()💡cancel 的作用💡不处理边界…...

IDEA关联Tomcat,部署JavaWeb项目

将IDEA与Tomcat关联 创建JavaWeb项目 创建Demo项目 将Tomcat作为依赖引入到Demo中 添加 Web Application 编写前端和后端代码 配置Tomcat server,并运行...

12. k8s二进制集群之kubelet部署

什么是kubelet准备事项创建kubelet-bootstrap.kubeconfig文件创建kubelet配置文件创建kubelet服务配置文件(将kubelet配置成系统服务)分发CA证书及Kubelet-bootstrap.kubeconfig到所有工作节点最后启动工作节点的kubelet服务总结什么是kubelet Kubelet 是 Kubernetes 的核心…...

【5】阿里面试题整理

[1]. 介绍一下ZooKeeper ZooKeeper是一个开源的分布式协调服务,核心功能是通过树形数据模型(ZNode)和Watch机制,解决分布式系统的一致性问题。 它使用ZAB协议保障数据一致性,典型场景包括分布式锁、配置管理和服务注…...

android的DataBinding的使用

参考: Android基础入门:dataBinding的简单使用 Android DataBinding的使用...

ChatGPT搜索免费开放:AI搜索引擎挑战谷歌霸主地位全面分析

引言 2025年2月6日,OpenAI宣布ChatGPT搜索功能向所有用户免费开放,且无需注册登录。这一重大举措在搜索引擎行业引发巨大反响,有观点认为"谷歌搜索时代即将结束"。本文将深入分析ChatGPT生成式AI搜索对谷歌搜索业务及全球搜索市场…...

从0开始掌握Java开发框架:学习路线与系统指南

目录 1. Java 开发框架的分类1. Web 开发框架2. 持久层框架3. 依赖注入框架4. 微服务框架5. 测试框架 2. 主要框架的作用及关系(1)Spring Framework(2)Spring MVC(3)Spring Boot(4)M…...