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

C++:入门基础

1.命名空间

1.1namespace的价值

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突或者名字污染,namespace关键字的出现就是针对这种问题的。

C语言项目中命名冲突是普遍存在的问题,C++引入namespace就是为了更好的解决这样的问题。

#include<stdio.h>int rand = 5;
int main()
{printf("%d\n", rand);return 0;
}#include<stdio.h>
#include<stdlib.h>int rand = 5;
int main()
{printf("%d\n", rand);return 0;
}

由上图可知:当包含头文件<stdlib.h>时,全局变量rand就会与头文件<stdlib.h>中的rand函数冲突,这是非常令人无语的一件事,C++创始人本贾尼·斯特劳斯特卢普在创建C++中考虑到这一问题并提出了使用namespace来解决这一问题。

1.2namespace的定义
  • 定义命名空间,需要使用到namespace关键字,后面根命名空间的名字,然后再加一对{}即可,其中{}中的信息即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
  • namespace本质是定义了一个域,这个域根全局域各自独立,不同的域可以定义同名变量
  • C++中域有函数局部域、全局域、命名空间域、类域;域会影响编译时查找一个变量/函数/类型出处(声明或者定义)的逻辑,所以有了域隔离名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域则不影响变量的生命周期
  • namespace只能在全局定义,不能在函数中定义,但是namespace可以嵌套定义
  • 项目工程中当包括多个同名的namespace是会认为是同一个namespace,不会起冲突
  • C++标准库都放在一个叫std(standard)的命名空间中
#include<iostream>
#include<stdlib.h>
namespace cwy//cwy为命名空间的名字
{//命名空间中可以定义变量/函数/类型// //定义变量randint rand = 5;//定义函数int Add(int x, int y){return x + y;}//定义结构体类型struct Node{struct Node* next;int val;};
}int main()
{printf("%d\n", rand);
}

提示:这里之所以打印结果为1573014864是因为rand的返回值是随机值,我们可以打印出rand的地址。我们还可以看到在执行代码时程序并没有报错,这是因为变量rand被namespace域封住了,这里的rand是全局的rand函数指针。如果想要打印变量rand可以在rand前面加上cwy::(即cwy::rand)代表在cwy这个命名空间域中查找变量rand。代码如下:

namespace cwy//cwy为命名空间的名字
{//命名空间中可以定义变量/函数/类型// //定义变量randint rand = 5;//定义函数int Add(int x, int y){return x + y;}//定义结构体类型struct Node{struct Node* next;int val;};
}int main()
{//这里的rand是全局的rand函数指针printf("%d\n", rand);//这里的rand是指定cwy命名空间中的randprintf("%d\n", cwy::rand);return 0;
}

1.3namespace的嵌套
//namespace的嵌套
namespace cwy
{namespace hello{int rand = 5;int Add(int x, int y){return x + y;}}namespace world{int rand = 5;int Add(int x, int y){return x + y;}}
}int main()
{printf("%d\n", cwy::hello::rand);printf("%d\n", cwy::world::rand);printf("%d\n", cwy::hello::Add(1, 2));printf("%d\n", cwy::world::Add(1, 2));return 0;
}

微提示:不同的域可以定义同名变量,所以上面代码中hello域和world域中的rand不存在冲突,及时嵌套了多层namespace命名空间,但是使用规则还是一样,想要使用域中的变量就在变量前面加上域名和俩个冒号(即域名::),其中(::)代表的是域作用限定符

由上图可知,namespace只可以在全局定义

1.4命名空间的使用

编译查找一个变量是声明/定义时,默认只会在局部或者全局查找,不会到命名空间里去查找。所以我们要使用命名空间中定义的变量/函数/类型由三种方法:

  • 指定命名空间访问,项目中推荐这种方式
  • 使用using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式
  • 展开命名空间中全部成员,项目不推荐,因为风险很大,日常小练习程序为了方便推荐使用
#include<stdio.h>namespace cwy
{int a = 0;int b = 1;
}int main()
{//“a”: 未声明的标识符	printf("%d\n", a);return 0;
}

微提示:这里的报错原因我们在上面也提到过,编译查找一个变量是声明/定义时,默认只会在局部或者全局查找,不会到命名空间里去查找,所以会报错,下面我们将提及3中访问方式

一:指定命名空间访问

namespace cwy
{int a = 0;int b = 1;
}int main()
{//指定命名空间访问printf("%d\n",cwy:: a);return 0;
}

指定命名空间访问的方式是比较推荐的

二:使用using将命名空间中某个成员展开

namespace cwy
{int a = 0;int b = 1;
}//使用using将命名空间中某个成员展开
using cwy::b;
int main()
{printf("%d\n", cwy::a);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);printf("%d\n", b);return 0;
}

微提示:使用using将命名空间中某个成员展开对于那些需要经常访问的成员特别方便,使用是只需使用using再加上域名,域作用限定符和访问的成员名即可(即 using cwy::b;)

三:展开命名空间中全部成员

namespace cwy
{int a = 0;int b = 1;
}//展开命名空间中全部成员
using namespace cwy;
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

微提示:展开命名空间中全部成员的方式我们不推荐使用特别是在大项目中,因为当命名空间中的成员很多时,需要展开的成员就特别多,每一条需要的语句都展开一次那么代价是特别大的,程序效率会降低,风险很大,所以我们在日常练习中可以使用但是在项目中不推荐使用。

2.C++输入和输出

  • <iostream>是Input  Output  Stream 的缩写,是标准的输入、输出流库,定义了标准的输输出对象。
  • std::cin是istream类的对象,它主要面向窄字符的标准输入流。
  • std::cout是outsream类的对象,它主要面向窄字符的标准输出流。
  • std::endl是一个函数,流插入输出时,相当于一个换行字符加刷新缓冲区。
  • <<是流插入运算符,>>流提取运算符(C语言还用这两个运算符做位运算左移/右移)。
  • 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。
  • 一般日常练习中我们可以包含using namespace std就可以使用输入输出流 ,实际项目开发中 不建议使用using namespace std。
  • 在包含头文件<iostream>的文件中可以不用包含<stdio.h>也可以使用printf和scanf,这是因为头文件<iostream>间接包含了<stdio.h>。
#include<iostream>
using namespace std;int main()
{int a = 0;double b = 1.1;char c = 'x';cout << a << " " << b << " " << c << endl;return 0;
}

微提示:在main函数定义了是三个变量,整形a,浮点型b,字符型c。

分别将整形a,空格,浮点型b,空格,字符型c插入到显示台中(即cout中),endl(end line)表示换行的意思,相当于C语言中的“\n”,'\n'。

特别需要注意的是C++不需要手动输入指定格式就可以自动识别并输出了

#include<iostream>
using namespace std;int main()
{int a = 0;double b = 1.1;char c = 'x';cout << a << " " << b << " " << c << endl;//输入cin >> a >>b >>c;//输出cout << a << " " << b << " "  << c << endl;return 0;
}

3.缺省参数

  • 缺省参数(默认函数)是声明或者定义函数时为函数参数指定一个缺省值。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否者使用指定的实参,缺省参数分为全缺省和半缺省函数。
  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右向左依次连续缺省,不能间隔跳跃给缺省值。
  • 带缺省参数的函数调用,C++规定必须从左向右依次给实参,不能跳跃给实参。
  • 函数声明和定义分离时,缺省参数不能再函数声明和定义中同时出现,规定必须函数声明给缺省值。
#include<iostream>
using namespace std;void func(int a = 5)
{cout << a << endl;
}int main()
{func();//没有给实参时,使用默认值func(10);//传参时,使用指定的实参return 0;
}

微提示:在main函数中调用了两次func函数,第一次调用没有传参,所以使用默认值;第二次调用时传了实参10,所以使用实参10。

#include<iostream>
using namespace std;//全缺省
void func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a <<  endl;cout << "b = " << b << endl;cout << "c = " << c << endl;printf("\n");
}int main()
{func1();func1(1);func1(1, 2);func1(1, 2, 3);return 0;
}

微提示:func1函数共定义了3个形参并且3个形参都给了默认值,所以func1为全缺省函数,在main函数中共调用了func1函数4次,第一个func1函数1个实参都没有传,所以都打印默认值;第二个func1函数给了1个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,所以第一打印实参,第二个和第三个使用默认值;第三个func1函数给了2个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,实参给了第一第二个形参,所以第一个、第二个打印实参,第三个使用默认值;第四个func1函数给了3个实参,全部都使用实参值。

#include<iostream>
using namespace std;//半缺省
void func2(int a , int b = 10, int c = 20)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl <<endl;}int main()
{func2(100);func2(100, 200);func2(100, 200, 300);return 0;
}

微提示:func2函数共定义了3个形参并且第一个形参没有给形参,后面两个都给了默认值,所以func2为半缺省函数,在main函数中共调用了func2函数3次;第一个func2函数给了1个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,所以第一打印实参,第二个和第三个使用默认值;第二个func2函数给了2个实参,由于C++规定带缺省参数的函数调用必须从左向右依次给实参,不能跳跃给实参,实参给了第一第二个形参,所以第一个、第二个打印实参,第三个使用默认值;第三个func2函数给了3个实参,全部都使用实参值。

相关文章:

C++:入门基础

1.命名空间 1.1namespace的价值 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称都将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c;避免命名冲突或者名字…...

微信小游戏 彩色试管 倒水游戏 逻辑 (二)

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义一个 Water class 1. **定义接口和枚举**&#xff1a; - WaterInfo 接口定义了水的颜色、高度等信息。 - PourAction 枚举定义了水的倒动状态&#xff0c;…...

【链表】算法题(一) ---- 力扣 / 牛客

一、移除链表元素 移除链表中值为val的元素&#xff0c;并返回新的头节点 思路&#xff1a; 题目上这样说&#xff0c;我们就可以创建一个新的链表&#xff0c;将值不为val的节点&#xff0c;尾插到新的链表当中&#xff0c;最后返回新链表的头节点。 typedef struct ListNo…...

Linux系统之部署盖楼小游戏

Linux系统之部署盖楼小游戏 一、小游戏介绍1.1 小游戏简介1.2 小游戏玩法基本介绍1.3 项目预览二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍2.3 版本要求三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本四、安装node.js4.1 安装nvm4.2 查看nvm版本4.3 安装…...

“金山-讯飞”杯2024年武汉理工大学程序设计竞赛 A. Mobiusp败走***(思维题-点双连通分量、连通性)

题目 思路来源 官方题解 题解 手玩发现&#xff0c;能换的话&#xff0c;当且仅当.和1在一个环里&#xff0c;而这就是点双连通分量 所以最优策略是先把.换到(x,y)的位置&#xff0c;然后判断.和1在不在一个环里 也就是&#xff1a; 1. 判断删掉1时&#xff0c;.和(x,y)联…...

【机器翻译】基于术语词典干预的机器翻译挑战赛

文章目录 一、赛题链接二、安装库1.spacy2.torch_text 三、数据预处理赛题数据类定义 TranslationDataset批量处理函数 collate_fn 四、编码器和解码器Encoder 类Decoder 类Seq2Seq 类注意事项 五、主函数1. load_terminology_dictionary(dict_file)2. train(model, iterator, …...

推荐系统:从协同过滤到深度学习

目录 一、协同过滤&#xff08;Collaborative Filtering, CF&#xff09;1. 基于用户的协同过滤2. 基于物品的协同过滤 二、深度学习在推荐系统中的应用1. 深度学习模型的优势2. 深度学习在推荐系统中的应用实例 三、总结与展望 推荐系统是现代信息处理和传播中不可或缺的技术&…...

记录些Spring+题集(1)

接口防刷机制 接口被刷指的是同一接口被频繁调用&#xff0c;可能是由于以下原因导致&#xff1a; 恶意攻击&#xff1a;攻击者利用自动化脚本或工具对接口进行大量请求&#xff0c;以消耗系统资源、拖慢系统响应速度或达到其他恶意目的。误操作或程序错误&#xff1a;某些情…...

SpringBoot 解决 getSession().getAttribute() 在负载均衡环境下无法获取session的问题

在Spring Boot中&#xff0c;使用getSession().getAttribute()方法时遇到在负载均衡环境下无法正确获取session属性的问题&#xff0c;通常是由于session属性存储在单个服务器的内存中&#xff0c;而负载均衡会导致用户的请求被分配到不同的服务器上&#xff0c;因此无法找到在…...

Jmeter常用组件及执行顺序

一 常用组件 1.线程组 Thread Group 线程组是一系列线程的集合&#xff0c;每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中&#xff0c;每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中&#xff0c;线程组组件运行用户设置线程数量、初始化方式等…...

PTrade常见问题系列10

get_ashares获取list为空。 get_Ashares函数目前都是向行情服务器进行获取的 如果请求数过多&#xff0c;应答返回偶现为空现象&#xff0c; 后续版本内进行优化从服务器缓存内取&#xff0c;需求单号&#xff1a;202303213922&#xff0c;于PTradeQT1.0V202202.01.023内发布…...

数据结构(4.4)——求next数组

next数组的作用:当模式串的第j个字符失配时&#xff0c;从模式串的第next[j]的继续往后匹配 求模式串的next数组(手算) next[1] 任何模式串都一样&#xff0c;第一个字符不匹配时&#xff0c;只能匹配下一个子串&#xff0c;因此&#xff0c;往后&#xff0c;next[1]都无脑写…...

《mysql篇》--JDBC编程

JDBC是什么 JDBC就是Java DataBase Connectivity的缩写&#xff0c;翻译过来就很好理解了&#xff0c;就是java连接数据库。所以顾名思义&#xff0c;JDBC就是一种用于执行SQL语句的JavaApl&#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库&#xff…...

android studio 怎么下载 buildTool

在Android Studio中下载Build Tools&#xff0c;通常可以通过Android Studio内置的SDK Manager来完成。以下是详细的步骤&#xff1a; 一、通过Android Studio的SDK Manager下载Build Tools 启动Android Studio&#xff1a;首先&#xff0c;确保你已经安装了Android Studio&am…...

copy 和 mutableCopy 有点乱

字符串的拷贝操作 对 string literal (字符串字面量) 执行 copy 要打印指针指向对象的地址和指针本身的地址&#xff0c;可以使用 %p 格式符来输出指针地址。以下代码&#xff0c;展示了 originalString 和 copiedString 的指针地址和指向对象的地址&#xff1a; NSString *…...

sqlalchemy通过查询参数生成query

sqlalchemy通过查询参数生成query 在SQLAlchemy中,可以使用查询参数来动态生成查询。这通常通过使用.filter()方法和Python的比较运算符来实现。以下是一个简单的示例,展示如何使用查询参数生成查询: 假设我们有一个名为User的模型(表),它具有id、username和email字段。…...

【JavaScript 算法】二分查找:快速定位目标元素

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现三、应用场景四、优化与扩展五、总结 二分查找&#xff08;Binary Search&#xff09;是一种高效的查找算法&#xff0c;适用于在有序数组中快速定位目标元素。相比于线性查找&#xff0c;二分查找…...

论文研读:ViT-V-Net—用于无监督3D医学图像配准的Vision Transformer

目录 摘要 介绍 方法 VIT-V-Net体系结构 损失函数 图像相似性度量 变形场正则化 结果与讨论 摘要 在过去的十年里&#xff0c;卷积神经网络(ConvNets)在各种医学成像应用中占据了主导地位并取得了最先进的性能。然而&#xff0c;由于缺乏对图像中远程空间关系的理解&a…...

C++入门到进阶(图文详解,持续更新中)

C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 详解C入门知识到进阶&#xff0c;配合图观看易于理解记录 文章目录 目录 C入门到进阶&#xff08;图文详解&#xff0c;持续更新中&#xff09; 文章目录 前言 一、数据 &#xff08;一&#xff09;数据类…...

【React Hooks原理 - useRef】

概述 在Function Component项目中当我们需要操作dom的时候&#xff0c;第一时间想到的就是使用useRef这个Hook来绑定dom。但是这个仅仅是使用这个Hook而已&#xff0c;为了更好的学习React Hooks内部实现原理&#xff0c;知其所以然。所以本文根据源码从useRef的基础使用场景一…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文&#xff1a; 一文入门汽车毫米波雷达基本原理 &#xff1a;https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术&#xff0c;它们扮演着完全不同的角色&#xff1a; Redis: 内存数据库/数据结构存储 本质&#xff1a; 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能&#xff1a; 提供丰…...