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

C/C++复习 day1

C/C++复习 day1


文章目录

  • C/C++复习 day1
  • 前言
  • 一、C语言
    • 1.memcpy函数
    • 2.memmove函数
    • 3.strstr函数
    • 4.宏定义的函数
    • 5.大小端的介绍以及判断
  • 二、C++入门基础
    • 1.C++是如何支持函数重载的?
    • 2.建议用const enum inline去替代宏
  • 三、C++类和对象
    • 1.类大小的计算
    • 2.移动构造和移动赋值
      • 1.右值引用
      • 2.move关键字
      • 3.模板右引用
      • 4.完美转发
      • 5.移动构造和移动赋值
    • 3.初始化列表
      • 1.初始化列表的特性
      • 2.哪些类型必须在初始化列表中初始化?
    • 4.运算符重载
      • 1. 不支持重载的运算符
      • 2.自定义类型转化内置类型
  • 3. 内存管理
    • 1.new delete 和 malloc free的区别
    • 2.new 和 new[]底层实现原理
    • 3.内存泄露问题
      • 1.什么是内存泄漏?
      • 2.内存泄漏的危害
      • 3.如何解决内存泄漏
        • 1.RAII 智能指针
        • 2.使用内存泄漏检查工具
  • 总结


前言

随着C++课程的学习结束,接下来回顾一下C和C++中的难点,看看有什么是遗漏的。


一、C语言

1.memcpy函数

void* my_memcpy(void* des, const void* src, size_t num)
{assert(des != NULL && src != NULL);void* begin = des;for (size_t i = 0; i < num; i++){*(char*)des = *(char*)src;des = (char*)des + 1;src = (char*)src + 1;}return begin;
}

按照字节数去拷贝赋值

2.memmove函数

// 从右往左移动则小到大赋值 从左往右复制,则从大到小赋值
void* my_memmove(void* des,const void* src,size_t num)
{assert(des!=NULL && src!=NULL);void* begin = des;if (des < src){for (size_t i = 0; i < num; i++){*(char*)des = *(char*)src;des = (char*)des + 1;src = (char*)src + 1;}}else{for (size_t i = num-1; i!=-1; i--){*((char*)des + i) = *((char*)src + i);}}return begin;
}

注意赋值顺序

3.strstr函数

char* my_strstr(char* str1,const char* str2)
{int i = 0, j = 0;int flag = 0;char* begin = NULL;char* p1 = str1, *p2 = str2;while (p1[i] != '\0' && p2[j] != '\0'){if (p1[i] == p2[j]){if (flag == 0){begin = p1+i;flag = 1;}i++;j++;}else{i = i - j + 1;j = 0;flag = 0;}}if (p2[j] == '\0'){return begin;}else{return NULL;}
}

4.宏定义的函数

#define ADD(x,y) ((x)+(y))

5.大小端的介绍以及判断

大小端

int main()
{// 判断大小端 01 00 00 00 01// 大端 01 02 03 04//      00 00 00 01// 小端 01 02 03 04//      01 00 00 00int i = 1;if (*(char*)&i == 1){printf("小端\n");}else if (*(char*)(&i) == 0){printf("大端\n");}
}

二、C++入门基础

1.C++是如何支持函数重载的?

函数重载
C++支持函数重载而C语言不支持是因为函数在内存中的存储方式不相同,C语言是直接以函数名修饰,而C++是_Z 函数名长度 函数名 类型首字母,导致C++支持重载,而C语言不支持重载。

2.建议用const enum inline去替代宏

三、C++类和对象

1.类大小的计算

类大小的计算
总结:1.类大小的计算不包括static修饰的静态的一系列东西,函数也不算在内。
2. 类大小的计算要符合结构体的对齐规则。
3. 空类的大小为1。
4. 虚函数(多态,重写):要存放一个虚函数表,先存该父类的虚函数表,再存父类中的成员变量。
5. 虚继承,父类中要多存放一个偏移量。

2.移动构造和移动赋值

说起这两个,就必须先提起C++11引入的右值引用和几个关键字。

1.右值引用

int&& rr1=10;
double&& rr2 = x+y;

之前的一个&表示对变量的引用,现在两个&&表示对右值的引用。

2.move关键字

比如我们正常这样写,编译器会报错不支持。
无法将左值绑定到右值引用。

int x=10;
int&& rr1 = x;

但是我们通过move关键字即可完成。
move仅仅是将变量的右值取出。

int x=10;
int&& rr1 = std::move(x);

3.模板右引用

对于模板来说,对于它&&,此时则既可以接受左值传参,也可以接受右值传参。也就是万能引用。

void Fun(int &x){ cout << "左值引用" << endl; }
void Fun(const int &x){ cout << "const 左值引用" << endl; }
void Fun(int &&x){ cout << "右值引用" << endl; }
void Fun(const int &&x){ cout << "const 右值引用" << endl; }
template<class T>
void func(T&& value)
{fun(value);
}

如果我们执行程序可以发现,我们的输出全是左值引用,这是为什么呢?
模板的万能引用只是提供了能够接收同时接收左值引用和右值引用的能力, 但是引用类型的唯一作用就是限制了接收的类型,后续使用中都退化成了左值。
因此,需要我们的完美转发。

4.完美转发

void Fun(int &x){ cout << "左值引用" << endl; }
void Fun(const int &x){ cout << "const 左值引用" << endl; }
void Fun(int &&x){ cout << "右值引用" << endl; }
void Fun(const int &&x){ cout << "const 右值引用" << endl; }
// std::forward<T>(t)在传参的过程中保持了t的原生类型属性。
template<typename T>
void PerfectForward(T&& t)
{Fun(std::forward<T>(t));
}

通过forward<模板>(参数)即可实现完美转发,使左值按左值传参,右值按右值传参。

5.移动构造和移动赋值

移动构造和移动赋值
这样写避免了某些不必要的深拷贝。
noexcept关键字,表示该函数不会抛出异常。
注意赋值完,要对原对象进行处理,这里指针将其变为nullptr

3.初始化列表

1.初始化列表的特性

  1. 效率优势
    初始化列表在对象成员的初始化过程中效率更高。对于一些内置类型和没有默认构造函数的类类型成员,如果在初始化列表中进行初始化,能避免额外的默认初始化和赋值操作。
  2. 初始化顺序
    成员变量的初始化顺序是按照它们在类中的声明顺序,而不是在初始化列表中的顺序。
  3. 成员对象初始化
    对于类中的成员对象,使用初始化列表可以正确地调用其对应的构造函数进行初始化。
  4. 避免未定义行为
    如果不使用初始化列表对某些成员进行初始化,可能导致未定义的行为,尤其是对于具有复杂依赖关系的成员。

2.哪些类型必须在初始化列表中初始化?

  1. const成员变量
class MyClass {const int myConstVar;
public:MyClass(int val) : myConstVar(val) {}  // 必须在初始化列表中初始化
};
  1. 引用成员变量
class YourClass {int& myRefVar;
public:YourClass(int& var) : myRefVar(var) {}  // 引用必须在初始化列表中初始化
};
  1. 没有默认构造函数的类成员
class OtherClass {OtherClass(int x) {}  // 自定义构造函数,无默认构造函数
};class MainClass {OtherClass myOther;
public:MainClass(int val) : myOther(val) {}  // 需在初始化列表中初始化
};
  1. 基类
    当从基类派生出一个类,并且基类没有默认构造函数时,则必须在初始化列表中进行初始化。
class Base {Base(int num) {}
};class Derived : public Base {
public:Derived(int num) : Base(num) {}  // 初始化基类
};

4.运算符重载

1. 不支持重载的运算符

  1. 作用域操作符 ::
  2. 条件操作符 ?:
  3. 点操作符 .
  4. 预处理操作符 #

2.自定义类型转化内置类型

可以通过重载内置类型来完成
例如,以下代码将MyClass类转化为int类型,此时重载函数不需要写返回值。

class MyClass {
private:int value;public:MyClass(int val) : value(val) {}operator int() {return value;}
};int main() {MyClass obj(42);int num = obj;  // 调用重载的 operator int 进行类型转换std::cout << "Converted value: " << num << std::endl;return 0;
}

3. 内存管理

1.new delete 和 malloc free的区别

区别

2.new 和 new[]底层实现原理

  1. new 会调用operator new 先去开辟空间,开辟完后再调用对应的构造函数进行初始化。
  2. new [] 会调用n次operator new去开辟空间,然后再去调用n次构造函数进行初始化。

3.内存泄露问题

1.什么是内存泄漏?

内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
由于引入了异常问题,在抛出异常后对应的内存可能没有进行释放,久而久之就可能导致内存泄漏。

2.内存泄漏的危害

长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现
内存泄漏会导致响应越来越慢,最终卡死。

3.如何解决内存泄漏

1.RAII 智能指针
  1. auto_ptr
    最早引入的智能指针,但不支持赋值
  2. smart_ptr
    支持赋值,但是双链表的循环会出现问题。
  3. weak_ptr
    不增加计数,用来解决循环问题。
2.使用内存泄漏检查工具

总结

以上就是C/C++的总结一,接下来应该还有需要补充修改的内容。
本人小白一枚,有问题还望各位大佬指正。

相关文章:

C/C++复习 day1

C/C复习 day1 文章目录 C/C复习 day1前言一、C语言1.memcpy函数2.memmove函数3.strstr函数4.宏定义的函数5.大小端的介绍以及判断 二、C入门基础1.C是如何支持函数重载的&#xff1f;2.建议用const enum inline去替代宏 三、C类和对象1.类大小的计算2.移动构造和移动赋值1.右值…...

再见Figma!!新的设计,代码协作神器!【送源码】

软件介绍 Penpot 是一款专门用来帮助设计师和开发者更好地合作的软件。它可以让设计师轻松地做出漂亮的设计稿&#xff0c;还能让这些设计稿变成真正的网站或者应用的一部分。这样&#xff0c;设计师和开发者之间就不会因为沟通不畅而产生麻烦了。 Penpot 专为设计师与开发者之…...

快速拷贝复制工具软件@拷贝工具@多线程拷贝@robocopy

文章目录 refs常见复制工具高速拷贝工具特性对比 Robocopy&#x1f47a;Robocopy工具基本用法语法示例 常用选项常见选项列表示例 高级用法多线程复制日志记录 用例案例直接递归复制大量文件的文件夹多线程复制监视被打开文件文件数 复制时排除某个目录排除交接点跳过无法复制的…...

JavaScript 逆向爬取实战

准备介绍&#xff1a; 当我们学习完整个 JS 逆向技巧后&#xff0c;这里是一次完整的分析爬取实战 案例介绍 本节案例网站不仅在 API 参数有加密&#xff0c; 而且前端 JS 也带有压缩混淆&#xff0c;其前端压缩打包工具使用 webpack , 混淆工具使用 javascript-obfuscator 。…...

Vue 项目中导入文件时如何默认找寻该文件夹下的 index.vue 文件

文章目录 需求分析 需求 如下图&#xff0c;在Vue 项目中导入 frequencyChange 文件夹时如何默认找寻该文件夹下的 index.vue 文件 分析 确保项目结构和命名约定 首先&#xff0c;确保你的 Vue 单文件组件按照约定命名&#xff0c;例如&#xff1a; components/Example/inde…...

Idea2023.3.3 —— SourceTree与gitee关联

SourceTree SourceTree链接: https://pan.baidu.com/s/1oqPxhpHeNOOiuRRQydes6g?pwdngru 提取码: ngru 点击Generate 分别保存私钥和公钥 gitee官网注册 这是gitee的公钥&#xff0c;与上面SourceTree的公钥私钥不一样 gitee生成公钥&#xff0c;确保本地安装好git git链接: h…...

一文HDMI (High-Definition Multimedia Interface)

HDMI&#xff08;High-Definition Multimedia Interface&#xff0c;高清多媒体接口&#xff09;是一种紧凑的音视频接口&#xff0c;它能够将未压缩的视频数据以及压缩或未压缩的数字音频数据&#xff0c;从符合HDMI标准的源设备无缝传输到兼容的计算机显示器、视频投影仪、数…...

【HBZ分享】高并发下如何设计缓存来提升系统性能?

普通模式 普通模式即前段调用后端接口&#xff0c;然后后端先查缓存&#xff0c; 查不到的情况下再查数据库&#xff0c;然后把数据库中的内容放到缓存中。瓶颈&#xff1a;瓶颈在于tomcat的性能&#xff0c;一般并发可以&#xff0c;面临海量并发冲击&#xff0c;tomcat就显得…...

【AI 绘画】 文生图图生图(基于diffusers)

AI 绘画- 文生图&图生图&#xff08;基于diffusers&#xff09; 1. 效果展示 本次测试主要结果展示如下&#xff1a; SDXL文生图 可爱Lora 2. 基本原理 模型基本原理介绍如下 stable diffusion首先训练一个自编码器&#xff0c;学习将图像数据压缩为低维表示。通过使…...

已解决HarmonyOS模拟器卡顿问题

以下是一些可以尝试用来解决 HarmonyOS 模拟器卡顿问题的方法&#xff1a; 一、检查系统资源占用 关闭不必要的后台程序 在电脑上&#xff0c;通过任务管理器&#xff08;Windows 系统中按 Ctrl Shift Esc&#xff0c;Mac 系统通过活动监视器&#xff09;查看并关闭占用大量 …...

C++ | 深入理解C++中的特殊类设计和单例模式(懒汉模式、饿汉模式)

目录 特殊类设计和单例模式 1、不可拷贝类 2、只能在堆上创建对象的类 3、只能在栈上创建对象的类 4、不可继承的类 5、单例模式(懒汉模式、饿汉模式) 特殊类设计和单例模式 在C编程中&#xff0c;类的设计往往需要满足特定的需求和约束。特殊类设计模式提供了一种方法来…...

Java设计模式之中介者模式

Java设计模式之中介者模式 在软件开发中&#xff0c;设计模式是解决常见问题的最佳实践。通过运用设计模式&#xff0c;我们可以提高代码的可维护性、可扩展性以及可读性。今天&#xff0c;我们将探讨一种非常重要的行为型设计模式——中介者模式&#xff08;Mediator Pattern…...

实现父组件调用子组件方法时报错:[Vue warn]: Invalid vnode type when creating vnode: null.

使用uniapp实现父组件调用子组件方法时报错&#xff1a;[Vue warn]: Invalid vnode type when creating vnode: null. 实现代码如下&#xff1a; 子组件&#xff1a; <template><view><view class"toolsHeader"><view class"toolsTitl…...

Java面试八股之什么是消息队列

什么是消息队列 消息队列&#xff08;Message Queue&#xff09;是一种应用程序间通信&#xff08;IPC&#xff09;的形式&#xff0c;它允许进程将消息发送到另一个消息队列&#xff0c;接收端则可以在任何时刻从队列中取出这些消息进行处理。消息队列提供了一种异步处理、解…...

【kubernetes】k8s配置资源管理

一、ConfigMap资源配置 ConfigMap保存的是不需要加密配置的信息 ConfigMap 功能在 Kubernetes1.2 版本中引入&#xff0c;许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API 给我们提供了向容器中注入配置信息的机制&#xff0c;ConfigMap 可以被…...

高分六号卫星助力农业监测_卫星介绍_论文分享_数据获取

卫星遥感已经成为农业发展的重要支持工具。《“数据要素X”三年行动计划(2024-2026年)》指出,在现代农业交通运输、应急管理等领域鼓励探索利用遥感数据。为什么高分六号会经常应用于农业检测呢&#xff1f;本文将介绍高分六号卫星的农业检测特性、在农业应用中的优势、具体农业…...

【Linux网络】TCP协议

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 引言1、TCP协议的特点2、确认应答机制3、超时重传机制4、TCP报头结构5、三次握手建立连接6、四次挥手断开连接总结 引言 TCP协议是传输层中非常重要的协议。本篇博客我们将从TCP头部信息、TCP状态转…...

Linux 基本指令讲解 上

linux 基本指令 clear 清屏 Alt Enter 全屏/退出全屏 pwd 显示当前用户所处路径 cd 改变目录 cd /root/mikecd … 返回上级目录cd - 返回最近所处的路径cd ~ 直接返回当前用户自己的家目 roor 中&#xff1a;/root普通用户中&#xff1a;/home/mike mkdir 创建一个文件夹(d) …...

深入了解指针(6)

文章目录 1.函数指针数组2.转移表3.回调函数 1.函数指针数组 存放函数指针的数组 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int add(int x, int y) {return x y; } int sub(int x, int y) {return x - y; }int main() {int (*p1)(int x, int y) add;int (…...

【Linux系列】known_hosts详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

MySQL4 多表查询 内连接

内连接 多表查询内连接 多表查询 数据准备 CREATE DATABASE db4; USE db4; -- 创建部门表 create table if not exists dept(deptno varchar(20) primary key , -- 部门号name varchar(20) -- 部门名字 );-- 创建员工表 create table if not exists emp(eid varchar(20) pr…...

力扣45:跳跃游戏2题解

题目链接&#xff1a; https://leetcode.cn/problems/jump-game-ii/description/?envTypestudy-plan-v2&envIdtop-100-liked 参考的代码随想录里面的题解&#xff1a; 题目 难度 中等&#xff0c;标的是中等难度&#xff0c;而且我之前做过这道题&#xff0c;但是我没写…...

产品经理-产品被同行抄袭如何处理(32)

在面试当中,如果被问到,产品被同行抄袭如何处理 竞争分析、战略决策。 1&#xff09;对行业相关事件的关注度&#xff1a;如之前对腾讯抄袭事件的讨论&#xff0c;如果能结合“被抄袭”后的失败案例&#xff08;例如联众&#xff09;和反抄袭的成功案例&#xff08;例如豆瓣&am…...

LDR6020在Type-C手机同时充电与USB2.0数据传输方案

随着科技的飞速发展&#xff0c;Type-C接口已成为智能手机等移动设备的主流充电和数据传输接口。为了满足用户对于高效充电与稳定数据传输的双重需求&#xff0c;乐得瑞科技推出的LDR6020芯片凭借其卓越的性能和丰富的功能&#xff0c;为Type-C手机提供了同时充电与USB2.0数据传…...

Python学习笔记(七)

""" 演示数据容器字典的定义 """# # 定义字典{key:value,key2:value2} 注意key不能是字典&#xff0c;value可以任意 # my_dict1 {"王力鸿": 99, "周杰轮": 88, "林俊节": 77}# #定义空字典 # my_dict2 {} # my…...

mysql中log

目录 MySQL 日志系统概述 日志类型 日志的作用和重要性 Mermaid图示 1. Undo Log 和 Redo Log 的协同工作图 2. Redo Log 确保持久性的流程图 Undo Log&#xff08;回滚日志&#xff09; 事务的原子性&#xff08;Atomicity&#xff09;保障 事务回滚机制 MVCC&#…...

iOS Object-C 创建类别(Category) 与使用

有时候使用系统给出类或者第三方的类,但是呢它们自带的属性和方法又太少,不够我们的业务使用,这时候就需要给“系统的类或者第三方类”创建一个类别(Category),把自己的想添加的属性和方法写进来. Category模式用于向已经存在的类添加方法从而达到扩展已有类的目的 一:创建Ca…...

Rocky系统部署k8s1.28.2单节点集群(Containerd)+Kuboard

目录 Kubernetes介绍 Kubernetes具备的功能 Kubernetes集群角色 Master管理节点组件 Node工作节点组件 非必须的集群插件 Kubernetes集群类型 Kubernetes集群规划 集群前期环境准备 开启Bridge网桥过滤 关闭SWAP交换分区 安装Containerd软件包 K8s集群部署方式 集…...

Springboot整合Flowable入门-学习笔记

目录 1、定义流程&#xff08;画图&#xff09; 2、Springboot部署流程 3、Springboot删除所有流程 4、Springboot根据 流程部署ID 查询 流程定义ID 5、Springboot启动(发起)流程 6、Springboot查询任务 6.1全部任务 6.2我的任务&#xff08;代办任务&#xff09; 7、…...

C语言常见的题目

1、 从源码到可执行文件会经历怎样的过程&#xff1f; 预编译&#xff1a;去掉空格、注释&#xff0c;处理预定义的指令&#xff0c;生成处理后的源代码文件。 编译&#xff1a;翻译成汇编代码&#xff0c;生成汇编文件。 汇编&#xff1a;翻译成机器码&#xff0c;生成一个或…...

青岛商业网站建设/专业恶意点击软件

人狠话不多&#xff0c;上图&#xff01; pinyin-match库 也是项目需要&#xff0c;由于下拉框的数据过多&#xff0c;使用人员不好选择&#xff0c;就做个拼音&#xff0c;大小写字母以及汉字的模糊搜索&#xff0c;结果就找到来这个 pinyin-match库&#xff0c;能够使用拼音…...

燕郊做网站找谁/指数查询

视频效果 炫酷按钮思路&#xff1a; 大致实录就是将盒子里边的before倾斜变形&#xff0c;使其变成一个平行四边形的效果&#xff0c;然后将其缩小隐藏&#xff0c;在放大&#xff0c;添加过渡时间就会出现如图所示的效果 代码&#xff1a; <!DOCTYPE html> <html l…...

电商网站建设与运营实训/中国站长

大家在是否碰到过这样的站点&#xff0c;全站文章系统采用FSO静态生成的HTML文件来显示。这样做的好处一来可以减轻服务器负担&#xff0c;提高访问速度。二来也阻止了SQL注入式的攻击。 我来说说他们的文章系统原理&#xff1a;全部文章均在数据库存有一个副本。另处根据模板生…...

免费做试用的网站/seo是什么意思呢

点击左上方蓝字关注我们 开放域问答&#xff08;Open-domain QA&#xff09;一直是自然语言处理领域的重要研究课题。百度从面向端到端问答的检索模型出发&#xff0c;提出了RocketQA训练方法&#xff0c;大幅提升了对偶式检索模型的效果&#xff0c;为实现端到端问答迈出了重要…...

sap.net怎么做网站/湖南网站建设推荐

夜光序言&#xff1a; 如果爱你可以让你幸福,那我就爱你;如果爱你不能让你幸福,那我就只喜欢你. 正文&#xff1a; 以道御术 / 以术识道 // pages/category/category.js //0 引入 用来发送请求的 方法 一定要把路径补全 import…...

二维码生成器怎么使用/seo优化服务是什么

2014/7/26 今天是删了英雄联盟的第一天&#xff0c;和平时上课的时间一样起来了。很早去了实验室&#xff0c;里面只有一个师弟。 今天打算好学树分治的&#xff0c;可是觉得应该写个题比较好&#xff0c;然后写了CF的一题&#xff0c;看了&#xff0c;不会&#xff0c;看了人家…...