C++ 基础特性深度解析

目录

引言

一、命名空间(namespace)

C++ 中的命名空间​

与 C 语言的对比​

二、缺省参数​

C++ 中的缺省参数​

与 C 语言的对比​

三、引用(reference)​

C++ 中的引用​

与 C 语言的对比​

四、inline(内联函数)​

C++ 中的内联函数​

与 C 语言的对比​

与 C 语言的对比​

总结​

引言

在编程语言的发展历程中,C++ 脱胎于 C 语言,在保留 C 语言高效性的同时,引入了诸多新特性以增强代码的可维护性、复用性和安全性。本文将聚焦于 C++ 的命名空间、缺省参数、引用、inline(内联函数)、函数重载这几个基础特性,并与 C 语言进行简要对比,帮助大家更好地理解 C++ 的独特之处。​

一、命名空间(namespace)

C++ 中的命名空间​

在 C++ 中,命名空间是一种将全局作用域划分成不同子作用域的机制,用于解决命名冲突问题。当项目规模较大,不同模块或库中可能出现同名的变量、函数或类,命名空间可以将这些同名实体分隔开来。

namespace Math {​int add(int a, int b) {​return a + b;​}​
}​
namespace Util {​int add(int a, int b) {​return a * b + a + b;​}​
}

使用命名空间中的实体时,可以通过 命名空间名::实体名 的方式访问,如 Math::add(3, 5);也可以通过 using namespace 命名空间名 指令引入整个命名空间,不过可能会带来新的命名冲突风险。​

与 C 语言的对比​

C 语言没有命名空间的概念,所有的全局标识符都位于同一个全局作用域中。在大型项目中,如果多个源文件定义了同名的全局变量或函数,就会导致命名冲突。例如,两个不同的库都定义了一个名为 add 的函数,链接时就会报错。C 语言通常通过在命名前添加特定的前缀或后缀来避免冲突,但这种方式不够优雅,也缺乏系统性。

二、缺省参数​

C++ 中的缺省参数​

C++ 允许在函数声明或定义时为参数指定默认值,当函数调用时如果没有传递该参数,就会使用默认值。缺省参数可以是全部参数都有默认值,也可以是部分参数有默认值,但有默认值的参数必须放在参数列表的右侧。

void printInfo(string name, int age = 18) {​cout << "姓名:" << name << ",年龄:" << age << endl;​
}

调用 printInfo("Alice") 时,age 参数会使用默认值 18;调用 printInfo("Bob", 20) 时,age 则使用传入的值 20。​

与 C 语言的对比​

C 语言不支持缺省参数,函数调用时必须为每个参数提供相应的实参。如果想要实现类似缺省参数的功能,在 C 语言中通常需要定义多个函数,通过函数重载的思想(虽然 C 语言没有真正的函数重载)来实现不同参数组合的功能,这会增加代码量和维护成本。例如,要实现类似上述 printInfo 函数的功能,可能需要定义两个不同名称的函数分别处理有年龄参数和无年龄参数的情况。

三、引用(reference)​

C++ 中的引用​

C++ 的引用是变量的一个别名,它和被引用的变量共享同一块内存空间,定义时必须初始化,且一旦初始化后就不能再引用其他变量。引用常用于函数参数传递和返回值,能避免值传递时的拷贝开销,提高效率,同时还可以通过引用在函数内部修改外部变量的值。

void swap(int &a, int &b) {​int temp = a;​a = b;​b = temp;​
}​
int num1 = 5, num2 = 10;​
swap(num1, num2);

这里 swap 函数通过引用参数,直接对外部的 num1 和 num2 变量进行操作,实现了交换功能。​

与 C 语言的对比​

C 语言中没有引用的概念,在函数参数传递时,通常使用指针来实现类似修改外部变量的效果。例如在 C 语言中实现交换两个整数的函数:

void swap(int *a, int *b) {​int temp = *a;​*a = *b;​*b = temp;​
}​
int num1 = 5, num2 = 10;​
swap(&num1, &num2);

虽然功能上与 C++ 的引用相似,但指针使用起来相对复杂,容易出现空指针解引用等错误,而引用在使用上更安全、简洁,语法也更接近变量本身。​

四、inline(内联函数)​

C++ 中的内联函数​

C++ 中的内联函数使用 inline 关键字修饰,它的目的是为了提高函数调用的效率。编译器在编译时会将内联函数的代码直接嵌入到调用处,避免了函数调用时的栈操作开销(如保存现场、跳转执行等)。不过,内联函数的代码通常比较短小,否则编译器可能会忽略 inline 关键字,将其当作普通函数处理。

inline int square(int num) {​return num * num;​
}

调用 square(5) 时,编译器会直接将函数体代码替换到调用位置,类似于宏定义,但比宏更安全,因为内联函数有类型检查。​

与 C 语言的对比​

C 语言中没有内联函数的概念,类似的功能通常通过宏定义来实现。例如:

#define SQUARE(num) ((num) * (num))

宏定义只是简单的文本替换,没有类型检查,可能会带来一些意外的错误,比如 SQUARE(a + b) 展开后是 ((a + b) * (a + b)),如果没有正确添加括号,可能导致结果不符合预期。而 C++ 的内联函数有类型检查,更加安全可靠。​

五、函数重载​

C++ 中的函数重载​

在 C++ 中,函数重载是指在同一作用域内,多个函数可以拥有相同的函数名,但参数列表(参数个数、类型、顺序)必须不同。编译器会根据函数调用时提供的实参类型和个数来匹配对应的函数版本。

int add(int a, int b) {​return a + b;​
}​
double add(double a, double b) {​return a + b;​
}

调用 add(3, 5) 会调用第一个 add 函数,返回整数结果;调用 add(3.14, 2.71) 会调用第二个 add 函数,返回浮点数结果。​

与 C 语言的对比​

C 语言不支持函数重载,每个函数必须有唯一的函数名。如果需要实现类似功能,在 C 语言中只能使用不同的函数名来区分,例如 add_int 和 add_double,这使得函数命名不够直观,也不利于代码的阅读和维护。​

总结​

C++ 的命名空间、缺省参数、引用、inline 函数和函数重载这些特性,在 C 语言的基础上极大地增强了语言的表达能力和编程的便利性。与 C 语言相比,C++ 能够更好地应对大型项目开发中的各种问题,提高代码的可读性、可维护性和运行效率。理解和掌握这些特性,是深入学习 C++ 编程的重要基础。​

以上从多个特性对比了 C++ 与 C 语言。你对这些特性还有哪些疑问,或者想了解 C++ 其他方面与 C 语言的对比,都能随时和我说。

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

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

相关文章

关于面试找工作的总结(四)

不同情况下收到offer后的处理方法 1.不会去的,只是面试练手2.还有疑问,考虑中3.offer/职位不满足期望的4.已确认,但又收到更好的5.还想挽回之前的offer6.确认,准备入职7.还想拖一下的1.不会去的,只是面试练手 HR您好,非常荣幸收到贵司的offer,非常感谢一直以来您的帮助,…

什么是高考?高考的意义是啥?

能见到这个文章的群体&#xff0c;应该都经历过高考&#xff0c;突然想起“什么是高考&#xff1f;意义何在&#xff1f;” 一、高考的定义与核心功能 **高考&#xff08;普通高等学校招生全国统一考试&#xff09;**是中国教育体系的核心选拔性考试&#xff0c;旨在为高校选拔…

L1和L2核心区别 !!--part 2

哈喽&#xff0c;我是 我不是小upper~ 昨天&#xff0c;咱们分享了关于 L1 正则化和 L2 正则化核心区别的精彩内容。今天我来进一步补充和拓展。 首先&#xff0c;咱们先来聊聊 L1 和 L2 正则化&#xff0c;方便刚接触的同学理解。 L1 正则化&#xff08;Lasso&#xff09;&…

字节推出统一多模态模型 BAGEL,GPT-4o 级的图像生成能力直接开源了!

字节推出的 BAGEL 是一个开源的统一多模态模型&#xff0c;他们直接开源了GPT-4o级别的图像生成能力。&#xff08;轻松拿捏“万物皆可吉卜力”玩法~&#xff09;。可以在任何地方对其进行微调、提炼和部署&#xff0c;它以开放的形式提供与 GPT-4o 和 Gemini 2.0 等专有系统相…

互联网大厂Java面试:从Spring Cloud到Kafka的技术考察

场景&#xff1a;互联网大厂Java求职者面试 面试官与谢飞机的对话 面试官&#xff1a;我们先从基础开始&#xff0c;谢飞机&#xff0c;你能简单介绍一下Java SE和Java EE的区别吗&#xff1f; 谢飞机&#xff1a;哦&#xff0c;这个简单。Java SE是标准版&#xff0c;适合桌…

18-Oracle 23ai JSON二元性颠覆传统

在当今百花齐放的多模型数据库时代&#xff0c;开发人员常在关系型与文档型数据库间艰难取舍。Oracle Database 23ai推出的JSON关系二元性&#xff08;JSON Relational Duality&#xff09;​​ 和二元性视图&#xff08;Duality Views&#xff09;​​ 创新性地统一了两者优势…

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …

DreamO字节开源图像编辑框架

DreamO是由字节跳动联合北京大学深圳研究生院电子与计算机工程学院共同研发的统一图像定制生成框架&#xff0c;支持多样化的编辑任务。 看下介绍的核心功能&#xff0c;还是很厉害的&#xff0c;今天咱们来体验下。 有正常本地部署版的。 https://github.com/bytedance/Drea…

EM储能网关ZWS智慧储能云应用(11) — 一级架构主从架构

ZWS智慧储能云针对储能场景下不同的架构体系进行了兼容&#xff0c;可以适配用户面临的复杂现场环境&#xff0c;满足更深层次的管理和维护需求。 简介 储能系统包含PCS、BMS、EMS等多个组件&#xff0c;不同储能架构管理和决策方式也有不同。为了适配用户面临的复杂现场环境&…

从0开始一篇文章学习Nginx

Nginx服务 HTTP介绍 ## HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写,是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 ## HTTP工作在 TCP/IP协议体系中的TCP协议上&#…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

Python SQLModel 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…

springboot根据部署服务器生成机器码+加密生成到期时间授权码设置项目在服务器的到期时间

生成机器码 首先需要在后端写个获取window或linux的机器码&#xff0c;根据CPU序列号和硬盘序列号(Windows)&#xff0c;拼接得到 /*** 操作系统的工具类*/ public class OSUtils {/*** 获取window or linux机器码** return*/public static String getOSNumber() {Map<Str…

Thumb-2指令集及其与STM32的关系

Thumb-2指令集及其与STM32的关系&#xff1a; 1. Thumb-2指令集是什么&#xff1f; 本质&#xff1a;Thumb-2是ARM公司设计的混合指令集架构&#xff0c;首次在ARMv7架构中引入&#xff08;如Cortex-M3/M4/M7&#xff09;。 核心创新&#xff1a; 融合了传统 32位ARM指令&…

Haption 力反馈遥操作机器人:6 自由度 + 低延迟响应,解锁精准远程操控体验

Haption自2001年成立以来&#xff0c;始终专注于力反馈设备与定制化解决方案的设计、研发及销售。作为工业级力反馈技术的先行者&#xff0c;其核心产品以高精度交互与可靠性著称&#xff0c;已与达索系统、空客、Orano 等行业头部企业达成深度合作&#xff0c;业务覆盖工程仿真…

C# ExcelWorksheet 贴图

C# ExcelWorksheet 贴图 在C#中,如果你想在Excel工作表中插入图片(例如,在ExcelWorksheet中贴图),你可以使用ClosedXML或EPPlus这样的库来操作Excel文件。下面我将分别介绍如何使用这两个库来实现这一功能。 使用ClosedXML 首先,确保你已经安装了ClosedXML包。你可以通…

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…

无人机EN 18031欧盟网络安全认证详细解读

EN 18031 是欧盟针对无线电设备发布的网络安全标准&#xff0c;于 2024 年 8 月正式发布&#xff0c;2025 年 1 月 30 日被列入《无线电设备指令》&#xff08;RED&#xff09;协调标准清单&#xff0c;并于 2025 年 8 月 1 日起强制执行。以下是对无人机 EN 18031 欧盟网络安全…