C++学习专栏【基础知识1】C++程序结构命名空间关键字标识符三字符序列

一、C++程序结构

让我们看一个简单的代码,它将打印Hello World一词。

#include <iostream>
using namespace std;
int main() {cout << "Hello World"; // prints Hello Worldreturn 0;
}

C++语言定义了几个头文件,其中包含对你的程序必要或有用的信息。对于这个程序,需要头文件<iostream>

using namespace std;这一行告诉编译器使用std命名空间。命名空间是C++中相对较新的一个添加内容

int main() 是程序执行开始的主函数

cout << "Hello World"; 导致屏幕上显示消息"Hello World"

return 0; 终止 main() 函数并使其返回值为 0 给调用进程

二、C++命名空间是什么?

想象一下,你住在一座大城市,这个城市被划分成不同的区域:市中心、住宅区、商业区等等。每个区域都有独特的街道、建筑和规则。在这个场景中,每个区域就是一个命名空间,它们提供了独立的作用域,允许你在其中声明和使用标识符,而这些标识符的名字在不同的命名空间中可以重复使用,因为它们互相隔离。

普通命名空间定义

在C++中,我们可以使用关键字namespace来定义命名空间。比如:

// 定义名为math的命名空间
namespace math {const double PI = 3.14159;double areaOfCircle(double radius) {return PI * radius * radius;}
}

上面的代码定义了一个名为 math 的命名空间。它包含了一个常量 PI 和一个计算圆面积的函数 areaOfCircle

就像城市中的区域可以进一步划分为子区域一样,命名空间也可以嵌套定义。例如:

命名空间的嵌套

namespace university {namespace department {void displayInfo() {std::cout << "Welcome to Computer Science Department!" << std::endl;}}
}

 这里,我们有一个嵌套的命名空间结构。university 是外层命名空间,内部有 department 命名空间,其中包含了一个显示信息的函数。

命名空间的使用

使用命名空间可以通过两种主要的方式:

限定名:使用作用域解析运算符::来访问命名空间中的成员,例如:

std::cout << "Hello, World!";university::department::displayInfo();

这里的 std:: 表示标准命名空间,cout 是其中的一个成员。

小知识:

C++标准库中的 std 命名空间是什么?为什么要使用它?

std 命名空间是 C++ 标准库的命名空间,包含了标准库中的大部分功能、类和对象。使用 std 命名空间可以避免与用户定义的标识符产生冲突,并让代码更具可移植性。要使用标准库的标识符(如 std::coutstd::vector),需要显式地指明其命名空间。

使用指令:通过 using 指令将整个命名空间的内容引入当前作用域,例如

using namespace math;using namespace university::department;

这将使得 math 命名空间中的所有内容在当前作用域内可用,但要注意这种方法可能会引入命名冲突。

示例:使用普通命名空间

现在,让我们结合实际的例子来展示命名空间的使用:

#include <iostream>// 定义名为math的命名空间
namespace math {const double PI = 3.14159;double areaOfCircle(double radius) {return PI * radius * radius;}
}int main() {// 使用限定名调用命名空间中的函数std::cout << "Area of circle with radius 2: " << math::areaOfCircle(2.0) << std::endl;// 使用指令引入命名空间中的常量using namespace math;std::cout << "Value of PI: " << PI << std::endl;return 0;
}

这个示例中,我们展示了如何使用限定名来调用命名空间中的函数,以及如何使用 using namespace 指令将命名空间中的常量引入当前作用域。

示例:使用嵌套命名空间

#include <iostream>namespace university {namespace department {void displayInfo() {std::cout << "Welcome to Computer Science Department!" << std::endl;}}
}int main() {// 通过限定名调用嵌套命名空间中的函数university::department::displayInfo();// 使用指令引入嵌套命名空间using namespace university::department;displayInfo(); // 现在可以直接使用 displayInfo(),因为已经引入了 department 命名空间return 0;
}

在这个示例中,我们展示了使用限定名和使用指令两种方式来使用嵌套命名空间。通过这些方法,我们可以方便地访问嵌套命名空间中的成员,使得代码更具有结构性和可读性。

总的来说,命名空间是C++中一种强大的工具,帮助我们组织和管理代码,避免命名冲突,提高代码的可读性和可维护性。

 三、C++的关键字

下面的列表显示了 C++ 中的保留字。这些保留字不得用作常量、变量或任何其他标识符名称,加粗的为C语言的关键字

asmelsenewthis
autoenumoperatorthrow
boolexplicitprivatetrue
breakexportprotectedtry
caseexternpublictypedef
catchfalseregistertypeid
charfloatreinterpret_casttypename
classforreturnunion
constfriendshortunsigned
const_castgotosignedusing
continueifsizeofvirtual
defaultinlinestaticvoid
deleteintstatic_castvolatile
dolongstructwchar_t
doublemutableswitchwhile
dynamic_castnamespacetemplate

以下是 C++ 中关键字的解释:

  • Asm:用于声明需要传递给汇编器的代码块。
  • auto:用作存储类别说明符,在特定块中定义对象。
  • break:终止任何 switch 语句或循环。
  • case:在 switch 语句中使用,指定语句表达式的匹配项。
  • catch:指定异常发生时应采取的操作。
  • char:C++ 语言中的基本数据类型之一,定义字符对象。
  • class:用于声明封装特定类的数据成员、操作或成员函数的用户定义数据类型。
  • const:帮助定义在程序执行的整个生命周期中值不会改变的对象。
  • continue:将控制转移到循环的起始点。
  • default:处理 switch 语句中无法处理的表达式值。
  • delete:内存释放运算符。
  • do:指示 do-while 语句的起点,在其中子语句将重复执行,直到表达式的值为逻辑假。
  • double:用于定义浮点数的基本数据类型。
  • else:特定于 if-else 语句的使用。
  • enum:声明用户定义的枚举数据类型。
  • extern:指定为外部的标识符与块具有外部链接。
  • float:用于定义浮点数的基本数据类型。
  • for:指示开始一个语句以实现重复控制。
  • friend:一个类或操作,其实现可以访问另一个类的私有数据成员。
  • long:数据类型修饰符,定义 32 位整数或扩展双精度数。
  • new:内存分配运算符。
  • operator:使用新声明重载 C++ 运算符。
  • private:声明在类外部不可见的类成员。
  • protected:声明对派生类除外的私有类成员。
  • public:声明在类外部可见的类成员。
  • register:存储类别说明符,是 auto 说明符,但也指示编译器将频繁使用的对象保留在寄存器中。
  • goto:帮助将控制权转移到指定的标签。
  • if:指示开始 if 语句以实现选择性控制。
  • inline:函数说明符,指示编译器优先选择内联替换函数体,而不是通常的函数调用实现。
  • int:定义整数对象的基本数据类型。
  • return:将对象返回给函数的调用者。
  • short:定义 16 位整数的数据类型修饰符。
  • signed:数据类型修饰符,指示对象的符号存储在高阶位。
  • sizeof:以字节为单位返回对象的大小。
  • static:静态定义的对象生存期存在于程序执行的整个生命周期。
  • struct:声明封装数据和成员函数的新类型。
  • switch:用于 switch 语句。
  • template:参数化或通用类型。
  • this:指向类的对象或实例的类指针。
  • throw:生成异常。
  • try:指示异常处理程序块的开始。
  • typedef:另一个整数或用户定义类型的同义词。
  • union:类似于结构体 struct,可以容纳不同类型的数据,但联合体只能同时容纳一个成员。
  • unsigned:数据类型修饰符,指示高阶位将用于一个对象。
  • virtual:函数说明符,声明一个类的成员函数将由派生类重新定义。
  • void:标识缺乏类型或函数参数列表的关键字。
  • volatile:这个特定关键字定义了一个对象,其值可能以编译器无法检测到的方式变化。
  • while:帮助启动 while 语句并结束 do...while 循环。

在编译器优化中,inline 关键字用于向编译器建议将函数内容直接插入函数调用的地方,而不是进行常规的函数调用。这样的建议通常用于短小的函数,以提高程序的执行效率。

1、inline 关键字

1.1 inline 关键字的作用:
  1. 减少函数调用开销: 普通函数的调用涉及堆栈操作、参数传递、指令跳转等开销,而使用 inline 关键字可以避免这些开销,直接将函数体内容嵌入到调用点处。

  2. 减少函数开销: 函数调用会产生一定的开销,如保存寄存器状态等。将函数内联可以减少这些开销,尤其在多次调用的场景中。

  3. 优化循环和小函数: inline 更适合用于简单的、执行频率高的函数或者循环体,因为在这些情况下,函数调用的开销相对更大。

1.2 影响程序性能的因素:
  1. 代码膨胀: inline 函数的函数体直接嵌入调用点,可能导致代码的膨胀,增加可执行代码的大小,对缓存和内存占用可能产生影响。

  2. 适用范围有限: 编译器可能会忽略 inline 关键字的建议,特别是对于复杂的函数、递归函数或函数体过大的情况。因此,即使使用了 inline,也不一定会被编译器完全内联。

  3. 编译器依赖: 编译器对 inline 关键字的处理方式可能因编译器而异,不同编译器可能会有不同的优化方式,对程序性能的影响也会有所不同。

  4. 适用于简短函数: 对于函数体较大、复杂的情况,inline 的效果可能不如预期,甚至可能因代码膨胀而降低性能。

#include <iostream>// 定义一个简单的加法函数
inline int add(int a, int b) {return a + b;
}int main() {int x = 5, y = 10;int result = add(x, y); // 调用 add() 函数std::cout << "Result: " << result << std::endl;return 0;
}

总的来说,inline 关键字能够在一定程度上提高程序性能,但使用时需慎重考虑函数的大小、调用频率以及编译器的优化能力,避免不必要的代码膨胀,从而达到更好的性能优化效果。

四、C++ 标识符

C++ 标识符是用于标识变量、函数、类、模块或任何其他用户定义项的名称。标识符以字母 A 到 Z 或 a 到 z 或下划线 (_) 开头,后跟零个或多个字母、下划线和数字(0 到 9)。

C++ 不允许在标识符中使用标点符号,C++ 是一种区分大小写的编程语言。

五、三字符序列(Trigraphs)

三字符序列是一种用于代表单个字符的替代表示方法,通常由三个字符组成,并且序列始终以两个问号开始。

三字符序列可以在出现的任何地方进行扩展,包括字符串字面值和字符字面值、注释以及预处理指令。

以下是最常用的三字符序列及其替换方式:

三字符序列替换
??=#
??/\
??'^
??([
??)]
??!|
??<{
??>}
??-~

并非所有编译器都支持三字符序列,而且由于它们容易造成混淆,不建议使用。

六、思考总结

C++ 中的 const 和 volatile 关键字有什么作用?它们在嵌入式系统中有什么应用?

  • const 关键字:用于定义常量,标识变量的数值不可修改。在嵌入式系统中,const 关键字常用于声明设备寄存器地址、常量表和程序代码的位置等。

  • volatile 关键字:用于声明易变的变量,告诉编译器该变量的值可能在程序控制之外发生改变,不应该被优化掉。在嵌入式系统中,volatile 常用于多线程编程、并行处理、硬件寄存器和中断服务程序中,确保编译器不会对这些值进行优化或缓存。

请解释关键字 auto 和 register 在 C++ 中的用途及其区别。

  • auto 关键字:在 C++11 中,auto 关键字用于自动推断变量的类型。它允许编译器根据变量的初始化表达式来推断变量的数据类型。

  • register 关键字:register 告诉编译器将变量存储在寄存器中以便快速访问。然而,现代编译器已经足够智能,在大多数情况下能够自行决定将变量存储在寄存器还是内存中。因此,register 关键字在现代编译器中往往不再被频繁使用。

typedef 关键字在 C++ 中有何作用?能否给出一个使用 typedef 的实际例子?

  • typedef 关键字:用于为现有的类型创建别名。它可以帮助简化复杂的类型名称,提高代码可读性,并减少代码中的重复。
// 实际例子:
typedef int IntArray[5]; // 创建一个名为 IntArray 的数组类型别名int main() {IntArray arr = {1, 2, 3, 4, 5}; // 使用 IntArray 类型别名创建数组// ...return 0;
}

在上面的例子中,IntArray 被定义为一个具有5个整数元素的数组类型别名,使得声明数组变得更简洁。

C++ 中的 static 关键字有什么作用?

  • static 关键字在不同的上下文中有不同的作用。在类内部,它用于声明静态成员变量和静态成员函数。在函数内部,它表示局部变量的生命周期在程序的整个执行过程中都存在。

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

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

相关文章

系统部署安装-Centos7-Kafka

文章目录 安装离线安装下载安装 安装 离线安装 下载 可以前往kafka的官网进行下载 https://kafka.apache.org/downloads安装 1.创建安装目录 mdkir /opt/software/kafka mkdir /opt/kafka 2.解压 sudo tar -xzf kafka_2.12-3.6.0.tgz -C /opt/kafka --strip-components…

c语言编程题经典100例——(46~50例)

1、实现字符串转数字。 在C语言中&#xff0c;可以使用库函数atoi()将字符串转换为整数。该函数接受一个字符串作为参数&#xff0c;并返回对应的整数值。以下是一个示例代码&#xff1a; #include <stdio.h> #include <stdlib.h> int main() { char str[] …

操作符keyof的作用是什么?

keyof 是 TypeScript 中的一个操作符&#xff0c;用于获取一个类型&#xff08;通常是一个对象类型或接口&#xff09;的所有公共属性名组成的字符串字面量联合类型。它常常用于类型安全的属性访问和映射类型的定义。 什么时候使用 keyof&#xff1f; 类型安全的属性访问&…

Java | 数据一致性校验遇到的时间序列化格式不一致问题如何解决?

关注&#xff1a;CodingTechWork 需求 设计 在开发过程中&#xff0c;有数据一致性校验需求。如下设计&#xff1a; 对于一些安全数据进行加密处理&#xff0c;并将这个加密值进行存储。当再次查询时&#xff0c;对当前数据进行加密并比对之前的加密值&#xff0c;看是否一…

ardupilot开发 --- 机载计算机 篇

0. 前言 关于机载计算机&#xff1b; 1. APSync 说到机载计算机Companion computer就不得不提另一个关键词APSync&#xff1b;APSync简化了机载计算机的设置&#xff0c;以便它可以为ArduPilot提供额外的功能&#xff0c;并简化与互联网服务的集成&#xff1b;提供日志下载和…

6、单片机与AT24C02的通讯(IIC)实验(STM32F407)

IIC简介 I2C(IIC,Inter&#xff0d;Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线&#xff0c;可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送&#xff0c;高速IIC总线一般可达…

如何使用简单的分支策略来保护您的 Git 项目

良好的分支策略可以使项目源代码获得一致且安全的数据&#xff0c;所有协作者可以在更短的生命周期内共享和访问这些数据。 您必须以灵活的方式设计项目模型&#xff0c;以便对所有成员角色和权限进行良好的管理。 我要谈论的并没有什么令人惊讶的新鲜事。您可能已经知道一些…

在idea中写sql语句,向数据库添加数据时,添加的字符串却显示???,解决方法

这是字符编码的问题 如何解决&#xff1a; 在idea的配置数据库的地方修改下边&#xff1a;mysql8版本和5版本差距不大。 在URL后加?useUnicodetrue&characterEncodingUTF8 例如 原来&#xff1a;String url “jdbc:mysql://localhost:3306/stu”; 改变后&#xff1a;St…

利用ARCGIS做地下水脆弱性评价分析

&#xff08;一&#xff09;行政边界数据、土地利用数据和土壤类型数据 本文所用到的河北唐山行政边界数据、土地利用数据和土壤类型数据均来源于中国科学院资源环境科学与数据中心&#xff08;https://www.resdc.cn/Default.aspx&#xff09;。 &#xff08;二&#xff09;地…

hadoop完全分布式搭建

文章目录 集群部署规划服务器准备Mobaxterm 远程登录实验前准备安装软件工具关闭防火墙 安装 JDK 和 Hadoop创建软件包目录解压软件包配置环境变量 集群搭建先创建 HDFS 工作目录和 LOG 目录配置集群配置环境配置 HDFS 主节点信息、持久化和数据文件的主目录配置 HDFS 默认的数…

技巧-GPU显存和利用率如何提高和batch_size/num_works等参数的实验测试

目录 简介实验测试显存占用问题GPU占用率波动问题num_work不是越大越好 总结 本专栏为深度学习的一些技巧,方法和实验测试,偏向于实际应用,后续不断更新,感兴趣童鞋可关,方便后续推送 简介 在PyTorch中使用多个GPU进行模型训练时&#xff0c;各个参数和指标之间存在一定的关系…

three.js结合vue

作者&#xff1a;baekpcyyy&#x1f41f; 1.搭建环境 ps&#xff1a;这里要按照node.js在之前有关vue搭建中有介绍 新建文件夹并在vsc终端中打开 1.输入vite创建指令 npm init vitelatest然后我们cd进入刚才创建的目录下 npm install安装所需依赖 npm run dev启动该项目 …

LLVM学习笔记(63)

4.4.3.3.2.3. 向量操作数类型的处理 下面开始处理向量类型。在默认情形下这些操作都会拆分为更小的操作或者调用库。 X86TargetLowering::X86TargetLowering&#xff08;续&#xff09; 667 // Some FP actions are always expanded for vector types. 668 for…

全栈软件开发工程师需要具备哪些技能

全栈软件开发工程师需要具备前端、后端和数据库等多方面的技能&#xff0c;以便能够在整个应用开发周期中承担各种任务。以下是典型的全栈软件开发工程师的技能栈&#xff1a; 一、前端技能&#xff1a; 1.HTML/CSS/JavaScript: 构建网页的基本技能&#xff0c;负责页面结构、样…

前端笔记:React的form表单全部置空或者某个操作框置空的做法

原创/朱季谦 在React框架前端开发中&#xff0c;经常会有弹出框的开发&#xff0c;涉及到弹出框&#xff0c;难免就会有表单。一般在关闭弹出框或者对表单联动时&#xff0c;往往都需要考虑对表单进行置空操作了。 我以前在工作就遇到过这类问题&#xff0c;正好顺便对表单置空…

【UE】中文字体 发光描边材质

效果 步骤 1. 先将我们电脑中存放在“C:\Windows\Fonts”路径下的字体导入UE 点击“全部选是” 导入成功后如下 2. 打开导入的“SIMSUN_Font”&#xff0c;将字体缓存类型设置为“离线” 点击“是” 这里我选择&#xff1a;宋体-常规-20 展开细节面板中的导入选项 勾选“使用距…

【投稿优惠、可EI检索】2024年机器人学习与自动化算法国际学术会议(IACRLAA 2024)

2024年机器人学习与自动化算法国际学术会议(IACRLAA 2024) 2024 International Academic Conference on Intelligent Control Systems and Robot Learning 一、【会议简介】 本届机器人学习与自动化算法国际学术会议(IACRLAA 2024)将于2024年1月23日在北京盛大开幕。这次会议将…

深信服技术认证“SCSA-S”划重点:SQL注入漏洞

为帮助大家更加系统化地学习网络安全知识&#xff0c;以及更高效地通过深信服安全服务认证工程师考核&#xff0c;深信服特别推出“SCSA-S认证备考秘笈”共十期内容&#xff0c;“考试重点”内容框架&#xff0c;帮助大家快速get重点知识~ 划重点来啦 深信服安全服务认证工程师…

目标检测YOLO系列从入门到精通技术详解100篇-【目标检测】YOLOV5

目录 算法原理 网络结构 1.1 Backbone 1.2 Neck 1.3 Head 损失计算 4.1 总损失

软件设计之原型模式

原型模式是从一个对象再创建另一个可定制的对象&#xff0c;而且不需要知道任何创建的细节。拷贝分浅拷贝和深拷贝。浅拷贝无法拷贝引用对象。在面试的时候&#xff0c;我们会投多家公司&#xff0c;根据岗位的不同我们会适当调整。使用原型模式可以快速达到需求&#xff0c;下…