C/C++基础补充

news2024/11/28 14:15:36

1. NULL和nullptr

有如下代码:

void func(int a) {
	cout << "func(int)" << endl;
}

void func(int* p) {
	cout << "func(int*)" << endl;
}

void test() {
	func(0);       // func(int);
	func(NULL);    // func(int);
	func(nullptr); // func(int*);
}

因为NULL为0的宏定义,因此如上函数重载, func(NULL)会优先调用func(int);


2. 头文件防卫式声明

防止头文件重复包含,建议头文件加上如下预编译格式:

#ifndef __HEAD__H__
#define __HEAD__H__

/* ............. */

#endif

3. 范围for

示例1:

int v[] { 1, 2, 11, 22, 33 };
for(auto x : v) {  // 遍历数组v,将v中元素拷贝到x中
    cout << x << endl;
}

int v[] { 1, 2, 11, 22, 33 };
for(auto& x : v) {  // 遍历数组v,无需拷贝
    cout << x << endl;
}

示例2:

for(auto x : { 1, 2, 11, 22, 33 }) {  // 遍历数组
    cout << x << endl;
}

4. strcpy和strcpy_s

strcpy:不检查目标字符串是否有足够的空间,可能导致目标字符串溢出;

strcpy_s:第二个参数指定目标字符串大小,会检查源字符串长度是否超过目标缓冲区长度。

// strcpy函数原型,头文件为<string.h>
char* strcpy(char* strDestination, const char* strSource);
/*
参数:
    strDestination:目标字符串地址;
    strSource:源字符串地址;
返回值:
    成功:strDestination
    失败:未定义错误,但可能导致缓冲区溢出
*/

// strcpy_s函数原型,头文件为<cstring>
errno_t strcpy_s(char *strDestination, size_t numberOfElements, const char *strSource);
/*
参数:
    strDestination:目标字符串地址;
    numberOfElements:strDestination的长度;
    strSource:源字符串地址;
返回值:
    成功:0
    失败:非0错误码
*/

5. 动态内存分配

5.1 C:malloc和free

void* malloc(int BytesNum);
/*
参数:
    BytesNum:要分配的字节数
返回值:
    成功:被分配内存的指针;
    失败:NULL
*/

void free(void* addr);
/*
释放malloc分配的内存
*/

示例1:

int* p = NULL;
p = (int*)malloc(sizeof(int)); // 在堆中分配4字节
if(p != NULL) {
    *p = 5;
    cout << *p << endl;
    free(p);  // 释放内存
}

示例2:

char* p = NULL;
p = (char*)malloc(100 * sizeof(char)); 
if(p != NULL) {
    strcpy_s(p, 100, "hello!");
    cout << p << endl;
    free(p);
}

示例3:

int* p = (int*)malloc(sizeof(int) * 100); // 分配可放100个整数的内存空间
if(p != NULL) {
    int* q = p;
    *q++ = 1; // 等价于 *(q++) = 1; 即 *q = 1; q++(q指向第二个整数地址)
    free(p);
}

5.2 C++:new和delete

new使用方式:

// 方式1
指针变量名 = new 类型标识符;

// 方式2
指针变量名 = new 类型标识符(初始值);

// 方式3
指针变量名 = new 类型标识符[该类型的内存单元个数];

// new分配内存失败
/*
若未指定nothrow标志,分配失败会抛出std::bad_alloc异常,可用try-catch语句来捕获和处理;
若指定了nothrow标志,分配失败会返回空指针,可用if语句来检查和处理。
*/

示例:

// 示例1
int* p = new int;
if(p != NULL) {
    *p = 8;
    cout << *p << endl;
    delete p;
}

// 示例2
int* p1 = new int(10);
if(p1 != NULL) {
    cout << *p1 << endl;
    delete p1;
}

// 示例3
int *pa = new int[100];  // 开辟有100元素的整型数组空间
if(pa != NULL) {
    int* q = pa;
    *q++ = 10; // [0] = 10
    *q++ = 20; // [1] = 20;
    cout << *pa << endl; // 10
    cout << *(pa+1) << endl; // 20
    delete[] pa;
}

6. C++的struct和class

structclass
成员默认权限publicprivate
默认继承权限publicprivate

7. inline内联函数

与普通函数不同,内联函数的定义需放在头文件中。

inline可能带来代码膨胀问题,消耗内存。 


8. 函数用法补充

8.1 一个返回值类型为void的函数可以返回一个返回值类型为void的函数

示例1:

void funcA(int a) {
	cout << a << endl;
	a--;
	if (a > 0) {
		return funcA(a);
	}
}

void test() {
    funcA(3);
}

运行结果:

示例2: 

void funcB() {
	cout << "Hello" << endl;
}

void funcC() {
	return funcB();
}

void test() {
    funcC();
}

运行结果:


8.2 函数形参之前尽量加const

优点:

(1)避免无意修改形参;

(2)调用更灵活;

void testNoConst(int& i) {  }

void testConst(const int& i) {  }

void test() {
	int b = 20;
	testNoConst(b);  // 正确
	testConst(b);    // 正确

	testNoConst(1);  // 错误
	testConst(1);    // 正确

	const int a = 10;
	testNoConst(a);  // 错误
	testConst(a);    // 正确
}

待补充 

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

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

相关文章

带你探索400G光模块测试

随着移动互联网、云计算、大数据等技术快速发展&#xff0c;数据中心及云计算资源需求的爆发式地增长&#xff0c;核心网传输带宽需求大幅度的提升&#xff0c;同时也带动了超大规模云数据中心的发展&#xff0c;对数据中心内部和之间的互联的光模块带宽需求呈快速增长&#xf…

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 思维链

ChatGPT 使用 拓展资料:吴恩达大咖 Building Systems with the ChatGPT API 思维链 在本节中,我们将重点讨论要处理输出的任务,这些任务通常通过一系列步骤来获取输入并生成有用的输出。有时,在回答特定问题之前,模型详细推理问题是很重要的。如果你参加了我们之前为开发人…

项目管理软件大对比:2023年15款最佳项目管理工具

简单的项目只需要一个电子表格清单可能就管理好了&#xff0c;而复杂的项目则需要适当的规划、任务分配、设定截止日期&#xff0c;以确保每个人都遵守它们、大家进行紧密的协作&#xff0c;并追踪所花费的时间。 让项目量化、可视化&#xff0c;资源合理分配、更容易的协作和…

x265的DCT

文章目录 DCT相关背景知识DCT变换系数矩阵32x32变换矩阵系数其他尺寸变换矩阵系数 变换计算过程流程图 代码实现数据残差变换系数对应残差 我的简单实现实现细节实现代码 x265对应代码实现openHEVC代码实现 DCT相关背景知识 DCT变换系数矩阵 标准提供了32x32的系数矩阵&#…

Leetcode | 39 组合总和

Leetcode | 39 组合总和 题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数…

理解 Vue 中的 MVVM 思想

1. 什么是 Vue Vue 是一套用于构建用户界面的渐进式 JavaScript 框架, 与其他大型框架不同的是, Vue 被设计为可以自底向上逐层应用, Vue 的核心库只关心视图层, 方便与第三方库或既有项目整合. 2. JavaScript 框架了解 jQuery : 大家熟悉的 JavaScript 框架, 优点是简化了 D…

VulnHub项目:MONEY HEIST: 1.0.1

靶机地址&#xff1a;Money Heist: 1.0.1 ~ VulnHub 渗透过程&#xff1a; 确定靶机ip&#xff0c;攻击机kali的ip 对靶机进行端口检测 存在22、53、80、3000、3001端口&#xff0c;访问80端口 发现了登录注册按钮&#xff0c;尝试进行注册 注册成功后进行登录&#xff0c…

VulnHub项目:Gaara

项目地址&#xff1a;Gaara: 1 ~ VulnHub 我爱罗&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;火影前200集无敌存在&#xff01;&#xff01;&#xff01; 渗透过程&#xff1a; 收集三件套&#xff01;搞一手~&#xff0c;发现80&#xff0c;访问web&…

第四节 ogre 2.3实现一个简单的模型纹理贴图

本节简单介绍下如何使用Ogre 2.3加载模型&#xff0c;并给模型贴上纹理材质。 一. 安装ogre 2.3 主要有两种安装方法&#xff1a; 简单安装方法&#xff0c;使用scripts for Ogre 2.3 脚本,按照官网给出的步骤安装即可。需要注意的是脚本解压后的 *.bat 文件需要修改下 CMAK…

【Java|golang】2611. 老鼠和奶酪

有两只老鼠和 n 块不同类型的奶酪&#xff0c;每块奶酪都只能被其中一只老鼠吃掉。 下标为 i 处的奶酪被吃掉的得分为&#xff1a; 如果第一只老鼠吃掉&#xff0c;则得分为 reward1[i] 。 如果第二只老鼠吃掉&#xff0c;则得分为 reward2[i] 。 给你一个正整数数组 reward1…

SpringCloud-Gateway过滤器

路由过滤器 GatewayFilter GatewayFilter 是网关中提供的一种过滤器&#xff0c;可以对进入网关的请求和微服务返回的响应做处理。 路由过滤器的作用是什么&#xff1f; 对路由的请求或想象做加工处理&#xff0c;比如添加请求头配置子路由下的过滤器只对当前路由的请求生效…

monkey测试关机/重启问题分析(二)

systemui关机dialog相关 1、systemui下拉关机按钮 通过Android 布局分析工具发现 按钮布局 base/packages/SystemUI/res-keyguard/layout/footer_actions.xml 按钮初始化和点击事件 frameworks/base/packages/SystemUI/src/com/android/systemui/qs/FooterActionsControlle…

斐波那契算法的理解

1.斐波那契数列 &#xff1a; 数组&#xff1a;int[] F{1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }; 特点&#xff1a; 从第三个数开始&#xff0c;后边每一个数都是前两个数的和 。F[k]F[k-1]F[k-2]; 如图所示&#xff1a; ①low、mid、high都是F数组的索引&#xff0c;F[k]-1表示…

基础实验篇 | 课程总体介绍(一)

本讲主要介绍多旋翼的特点及选用多旋翼作为实验平台的原因、对于无人系统教育的一些新需求、RflySim平台对于飞控的底层控制算法的开发优势、本期平台课程的设置、以及如何开发自驾仪系统。 相较于固定翼和直升机&#xff0c;多旋翼具有机械结构简单、 易维护的优点。以四旋翼…

操作Arrays.asList的list报UnsupportedOperationException的坑

Arrays.asList() 将数组转换成List集合 /*** Returns a fixed-size list backed by the specified array. (Changes to* the returned list "write through" to the array.) This method acts* as bridge between array-based and collection-based APIs, in* com…

通过Python封装商品ID获取阿里巴巴商品详情数据,阿里巴巴商品详情数据API接口,阿里巴巴API接口

目的&#xff1a;通过Python封装商品ID获取阿里巴巴商品详情数据&#xff0c;本文将给出Python代码的一些思路和示例。 首先&#xff0c;你需要找到获取阿里巴巴商品详情数据的API接口。阿里巴巴开放平台提供了一些API接口&#xff0c;例如阿里巴巴开放平台商品API&#xff0c…

软件开发项目成本控制的7个重点

1、精细计划预算和管控机制 制定详细的项目计划和预算&#xff0c;包括资源需求、人力资源、时间表和财务预测等&#xff0c;以确保项目不会超出预算。实时跟踪项目的实际开支和进度&#xff0c;并对计划进行调整&#xff0c;以便更好地管理成本。 软件开发项目成本控制的7个重…

MongoDB Study Notes

文章目录 1 MongoDB快速入门1.1 什么是MongDB1.2 部署安装——基于docker1.3 基本概念1.4 基本操作1.4.1 查看所有数据库1.4.2 切换数据库1.4.3 创建数据库1.4.4 删除数据库1.4.5 查看数据库中表1.4.6 新增数据1.4.7 查询数据1.4.8 更新数据1.4.8.1 更新不存在字段1.4.8.2 更新…

Nginx 504 gateway timeout

方案 调整这几个参数来调大nginx的超时时间。 proxy_connect_timeout proxy_send_timeout proxy_read_timeoutnginx 三个代理超时时间配置 proxy_connect_timeout 60s; Defines a timeout for establishing a connection with a proxied server. It should be noted that thi…

【期末划重点】计算机英语(2)(更新中)

阿金的计算机英语&#xff0c;线下考试版~ 时隔半年&#xff0c;又开始赌徒模式啦 这次尝试用大数据文本分析&#xff0c;精准备考 欢迎补充 2023计英期末考赌徒版 Part 1 词汇题&#xff08;20题&#xff0c;40分&#xff09;1、词库说明2、本题答题技巧3、背词方法4、完整词库…