一些C++入门基础

关键字

图引自  C++ 关键词 - cppreference.com

 命名空间

命名空间解决了C没办法解决的各类命名冲突问题

C++的标准命名空间:std

命名空间中可以定义变量、函数、类型:

namespace CS {//变量char cs408[] = "DS,OS,JW,JZ";int cs = 408;//函数void Func() {cout << "085400" << endl;}//类class student {public:void F() {cout << "bull and horse" << endl;}private:int a = 6;int b = 66;};
}

且命名空间可以嵌套(不常用):

namespace School {int x = 0;namespace CS {//};};

授权

命名空间未展开时,默认不能访问命名空间

全部展开:

using namespace CS;

部分展开(仅可访问部分已展开的变量、函数、类):

using CS::cs408;

或者加上作用域限定符直接访问:

	CS::student st1;st1.F();

合并

如果定义了多个同名的命名空间,会自动合并:

如果合并后有多个同名变量、函数、类型,会出现重定义。

缺省参数

声明或者定义函数时,为参数指定的缺省值,如没有传参时,使用缺省值:

Date(int year = 1, int month = 1, int day = 1) {};

全缺省:

Date(int year = 1, int month = 1, int day = 1) {};

半缺省(部分缺省):

半缺省参数必须从右往左给出,且不能间隔着给。

所以,调用半缺省参数的函数时,传参必须从左往右给出,同样不能间隔。

Date(int year, int month = 1, int day = 1) {};Date(2025);
Date(int year, int month, int day = 1) {};Date(2025,5);

注:在函数声明和定义分离的情况下,不能为声明和定义同时给出半缺省参数,避免声明和定义中的缺省值不同而无法调用。

函数重载

C++允许同一作用域下存在同名函数,条件是:形参的个数 or 类型 or 顺序不同:

Date(int a);
Date(int a, int b);
Date(int a, char b);
Date(char a, int b);

原理

C/C++ 中,一个程序要运行需经历:预处理、编译、汇编、链接;

(每日回顾:C程序预处理(本文包括宏定义)-CSDN博客)

在汇编阶段,对于一个函数,汇编器会为其分配一个地址,并将该地址与函数名关联起来,记录在符号表中;在链接完成之后,会形成完整的符号表。符号表包含了程序中所有符号的名称、地址和属性等信息。

VS中,C和C++的函数名修饰规则对比

 由上图可见,C语言仅在函数名前加 '_' 以在符号表中查找对应函数地址;而C++的函数名修饰中,还与形参有关,这也印证了前文所说函数重载的条件。

特殊情况

函数重载和缺省参数的函数同时存在可能会出现调用歧义:

//无参数 和 全缺省
void F() {};
void F(int a = 1, int b = 2) {};//一个参数 和 半缺省
void F(int a) {};
void F(int a, int b = 2) {};

引用

引用的底层和C指针一样,只是使用更加方便;一个变量的引用,就是给这个已存在的变量取个别名,这个引用与已存在的变量共用同一块内存空间。

int p = 0;
int& pp = p;    // pp是p的引用pp = 1;    // 修改pp,p也会随之修改

特性

1、必须在定义时就初始化;

2、一个变量可以有多个引用:

int p = 0;
int& pp = p;
int& ppp = p;

3、引用被初始化之后,不能再改变指向;

int p = 0;
int q = 1;
int& pp = p;
pp = q;    // 报错,不能再改变指向

使用场景

引用作为参数

void test(int& a){};
int main(){int b = 1;test(b);return 0;
}

引用作为返回值

int& test(int& a){a++;return a;
};
int main(){int b = 1;int ret = test(b);return 0;
}

 上面这段代码,其实test函数中返回的a变量,在出了函数作用域之后已经销毁,只不过我们用ret立刻接收了该引用的值;实际上返回的引用,已经是被释放的空间

所以,如果函数返回时,出了函数作用域,如果返回对象还在(还没还给系统),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回。

效率

使用传值传参和使用值作为返回值类型时,实际上都是实参或者返回变量的一份临时拷贝;所以当值较大时,效率必然低于使用引用传参或者使用引用作为返回值类型。

和指针对比

引用的底层实现,与指针相同,只不过使用时更为方便。

1、引用 在概念上是一个变量的别名,而指针存储地址;

2、引用在定义时必须初始化指向实体,指针不必;

3、引用在初始化引用一个实体后,不能再改变指向,而指针可以;

4、sizeof(引用) 是引用类型的大小,而指针始终是地址所占字节数大小;

5、引用++ 是引用的实体++,而指针++ 是向后偏移;

6、没有多级引用,有多级指针;

7、访问实体方式不同:引用 编译器会处理,而指针需要显式解引用;

8、引用使用起来更安全。

内联函数

以inline修饰的函数为内联函数。

普通函数在调用时,需要建立栈帧;内联函数会在编译时直接展开,没有建立栈帧的开销,提升程序运行效率。

有点像C中的宏函数,只不过宏是完全的只有替换,而内联函数是展开函数体。

inline void test(int a){};

特性

1、以空间换时间,但如果函数体过大,会使文件变大;

2、不同编译器的实现不同,一般编译器会将函数规模较小(10行左右)、且不是递归、且频繁调用的函数,采用inline修饰,否则会忽略。(内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求)

3、inline函数不建议声明和定义分离。因为内联函数展开后,就没有函数地址了,只有声明就会找不到定义,报链接错误。

auto关键字(C++11)

auto作为一 个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。简单来说,auto可以推导当前变量类型。

int a = 0;
auto b = a;
auto c = 'a';

使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

你不能使用auto来推导未知类型。

auto常用来与范围for、lambda表达式搭配使用。

范围for(C++11)

范围for使得在遍历一个有范围的集合时,更加方便:

int arr[10] = {0};
for (auto a : arr){cout << a << endl;
}

这段代码会依次取数组中所有的数据赋值给 a ,打印;

使用条件

1、for 循环迭代的范围是确定的(下图展示了不确定的范围);

void test(int arr[]){for(auto a : arr){cout << a << endl;}
}

2、迭代的对象要实现++和==的操作。

nullptr

int* p1 = NULL;
int* p2 = 0;

在C的头文件 stddef.h 中,有部分代码:

(条件编译见每日回顾:C程序预处理(本文包括宏定义)-CSDN博客)

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

NULL实际是一个宏,可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。

但是如果有:

void test(int a)
void test(int* a){};
int main(){test(NULL);
}

那么test(NULL) 到底调用谁?这就出现了问题,C++11中通过引入关键字nullptr 用来初始化空指针。

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

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

相关文章

学习笔记:黑马程序员JavaWeb开发教程(2025.4.6)

12.4 登录校验-JWT令牌-介绍 JWT&#xff08;JSON Web Token&#xff09; 简洁是指JWT是一个简单字符串&#xff0c;自包含指的是JWT令牌&#xff0c;看似是一个随机字符串&#xff0c;但是可以根据需要&#xff0c;自定义存储内容 Header是JSON数据格式&#xff0c;原始JSO…

香港科技大学物理学理学(科学计算与先进材料物理与技术)硕士招生宣讲会——深圳大学

香港科技大学物理学理学&#xff08;科学计算与先进材料物理与技术&#xff09;硕士招生宣讲会——深圳大学专场 &#x1f559;时间&#xff1a;2025年5月23日&#xff08;星期五&#xff09;14:30 &#x1f3eb;地点&#xff1a;深圳大学沧海校区致原楼1101 &#x1f9d1…

数据库优化技巧:MySQL 重复数据查询与删除(仅保留一条)的性能优化策略

目录 一、查询重复数据 二、删除重复数据 方法 1&#xff1a;创建临时表&#xff0c;操作完成后再删除临时表&#xff08;安全可靠&#xff0c;适合大表&#xff09; 步骤 1&#xff1a;创建临时表存储需删除的 ID 步骤 2&#xff1a;根据临时表删除数据 方法 2&#xff1a…

分布式ID生成器:原理、对比与WorkerID实战

一、为什么需要分布式ID&#xff1f; 在微服务架构下&#xff0c;单机自增ID无法满足跨服务唯一性需求&#xff0c;且存在&#xff1a; • 单点瓶颈&#xff1a;数据库自增ID依赖单表写入 • 全局唯一性&#xff1a;跨服务生成可能重复 • 扩展性差&#xff1a;分库分表后ID规…

Golang的代码注释规范与实践

# Golang的代码注释规范与实践 一、注释的重要性 代码注释是程序员交流的桥梁 代码注释是程序员之间沟通交流的重要形式&#xff0c;良好的注释能够帮助其他开发者更快地理解代码的意图和实现方式。 代码维护离不开注释 在项目维护过程中&#xff0c;良好的注释能够帮助开发者回…

Qt读取Excel文件的技术实现与最佳实践

目录 一、成果展示二、核心方法及原理1. QAxObject(基于COM接口)2. 第三方库QXlsx3. ODBC数据库驱动三、实现步骤详解1. QAxObject读取Excel(需安装Excel/WPS)2. QXlsx读取Excel(跨平台方案)四、技术选型与对比五、应用场景与优化建议1. 高频数据处理2. 跨平台工具开发3.…

机器学习第十五讲:决策树全面讲解:像玩“20个问题“游戏猜身份[特殊字符]

机器学习第十五讲&#xff1a;决策树全面讲解&#xff1a;像玩"20个问题"游戏猜身份&#x1f3ae; 资料取自《零基础学机器学习》。 查看总目录&#xff1a;学习大纲 关于DeepSeek本地部署指南可以看下我之前写的文章&#xff1a;DeepSeek R1本地与线上满血版部署&…

CCpro工程编程软件

CXproᴴᴰ 是一个软件应用套件&#xff0c;用以完成 ABB Cylon CB 系列 BACnet 控制器的设计、工程、编程、配置、测试、调试和维护。 主要优势 CXproᴴᴰ 提供改进的导航和页面命名&#xff0c;使开发人员能够轻松地围绕大型策略进行操作。它也允许立即访问可快速更新的点和…

数据库(二):ORM技术

什么是 ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff09; 是一种用于实现 对象模型&#xff08;面向对象&#xff09;与关系模型&#xff08;数据库&#xff09;之间映射的技术&#xff0c;使程序员可以通过操作对象的方式访问数据库数据&#xff0c;而无…

系统设计——项目设计经验总结1

摘要 在系统设计的时候&#xff0c;注意域的区分&#xff0c;功能区分、类的区分、方法区分范围和定义。在系统设计的时候的&#xff0c;需要思考类、方法在什么情况下会涉及到修改&#xff0c;遵循记住&#xff1a;一个类应该只有一个原因被修改&#xff01; 当不满足&#x…

【Java高阶面经:微服务篇】3.熔断机制深度优化:从抖动治理到微服务高可用架构实战

一、熔断抖动的本质剖析与核心成因 1.1 熔断机制的核心价值与抖动危害 熔断机制作为微服务弹性架构的核心组件,通过模拟电路断路器逻辑,在服务出现异常时自动阻断请求链,防止故障扩散引发雪崩。但频繁的“熔断-恢复-熔断”抖动会导致: 用户体验恶化:请求成功率波动大,响…

深入浅出人工智能:机器学习、深度学习、强化学习原理详解与对比!

各位朋友&#xff0c;大家好&#xff01;今天咱们聊聊人工智能领域里最火的“三剑客”&#xff1a;机器学习 (Machine Learning)、深度学习 (Deep Learning) 和 强化学习 (Reinforcement Learning)。 听起来是不是有点高大上&#xff1f; 别怕&#xff0c;我保证把它们讲得明明…

【动手学深度学习】1.1~1.2 机器学习及其关键组件

目录 一、引言1.1. 日常生活中的机器学习1.2. 机器学习中的关键组件1&#xff09;数据2&#xff09;模型3&#xff09;目标函数4&#xff09;优化算法 一、引言 1.1. 日常生活中的机器学习 应用场景&#xff1a; 以智能语音助手&#xff08;如Siri、Alexa&#xff09;的唤醒…

Pytorch针对不同电脑配置详细讲解+安装(CPU)

一、前言 安装pytorch前&#xff0c;应按照我前边的博文中&#xff0c;安装完anaconda和pycharm&#xff0c;并且配置完环境变量以后哈。 Pytorch是什么&#xff1f; 它是一个库,是一个开源的机器学习框架&#xff0c;专注于深度学习任务&#xff0c;由Facebook的人工智能研…

[python] 轻量级定时任务调度库schedule使用指北

schedule是一款专为简化定时任务调度而设计的Python库&#xff0c;它通过直观的语法降低了周期性任务的实现门槛。作为进程内调度器&#xff0c;它无需额外守护进程&#xff0c;轻量且无外部依赖&#xff0c;适合快速搭建自动化任务。不过&#xff0c;该库在功能完整性上有所取…

React的合成事件(SyntheticEventt)

文章目录 前言 前言 React的合成事件&#xff08;SyntheticEvent&#xff09;是React为了统一不同浏览器的事件处理行为而封装的一套跨浏览器事件系统。它与原生事件的主要区别如下&#xff1a; 1. 事件绑定方式 • 合成事件&#xff1a;使用驼峰命名法绑定事件&#xff08;如…

报表控件stimulsoft教程:如何在报表和仪表板中创建热图

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…

[免费]苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端)&#xff0c;分享下哈。 项目视频演示 【免费】苍穹微信小程序外卖点餐系统修改版(跑腿点餐系统)(SpringBoot后端Vue管理端) Java毕业设计…

Dify 快速上手 MCP!Java 搭建 MCP Server 接入 Dify详细实战攻略

近期&#xff0c;MCP协议在AI领域热度飙升&#xff0c;成为众多开发者和行业人士热议的焦点。下文先介绍MCP究竟是什么&#xff1f;再详细讲下 Dify DeepSeek Java开发 MCP server 实战。 一、MCP的基本概念 MCP&#xff0c;全称为模型上下文协议&#xff08;Model Context P…

力扣992做题笔记

左神做法的理论依据 我们可以通过 集合的包含关系 和 具体示例枚举 来直观理解这一推导过程。以下结合题目示例 1 进行详细说明&#xff1a; 示例 1 分析 输入&#xff1a;nums [1,2,1,2,3], k 2 目标&#xff1a;计算恰好包含 2 种不同整数 的子数组个数。 步骤一集合 A…