Cpp 01 — namespace命名空间、C++的输入与输出、缺省参数、函数重载、引用、隐式类型转换

前言:本文章主要用于个人复习,追求简洁,感谢大家的参考、交流和搬运,后续可能会继续修改和完善。

因为是个人复习,会有部分压缩和省略。

一、namespace命名空间

C++使用命名空间(namespace)来避免命名冲突。

在定义一个命名空间后,在外部未经处理是不可调用其中内容的。

命名空间会定义一个新的域,命名空间中的内容局限于该命名空间中。在链接时,相同命名空间里的东西会被合并到一起。同一域里不能定义同名的变量(不能重复定义)

命名空间可以嵌套定义。

只有展开命名空间或指定域时,才可以使用命名空间里的东西

命名空间使用方式:

1.加命名空间名称及作用域限定符。(在局部:std::cin)

2.使用using将命名空间中成员引入。(在全局:using std::cin;)

3.使用using namespace命名空间名称引入。(在全局:using namespace std;)

using namespace std;的意义:C++为了防止命名冲突,把标准库的东西都放进了std这个命名空间,这个代码的意思是展开了std该命名空间,可以使用该域里的所有东西。

使用命名空间的建议:

1.在项目中,尽量不要用using namespace std;因为可能会导致命名冲突,库里有些我们不了解的东西可能会与我们自己定义的变量名冲突。

2.一般日常练习可以使用using namespace std;

3.项目中,常用指定命名空间访问+展开。例如:using std::cin;

二、C++的输入与输出

C++中我们不需要给输入输出指定类型,因为它们可以自动识别类型

C++的输入与输出:cin、cout

头文件:<iostream>

自动识别类型的原理:函数重载+运算符重载

cout标准输出对象:控制台

cin标准输入对象  :键盘

cin与cout需要结合运算符来使用

>>:流提取运算符。提取输入的东西,并放到变量中。也就是我们所说的输入。

<<:流插入运算符。将变量插入到控制台中。也就是我们所说的打印。

平时建的项目都是控制台应用程序,是和控制台交互的。 

实际上cout和cin分别是ostream和istream类型的对象,它们可以自动识别类型。

注意:

1.打印char*类型时,cout无法判断是指针还是字符串

2.流提取和流插入的运算符优先级是高于==的

三、缺省参数

缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值。

缺省参数分为全缺省参数和半缺省参数(部分参数缺省)。

缺省参数的特点:

1.缺省参数不能在声明和定义中同时出现,建议在声明中给。

2.因为传参数时是从左往右给的,所以给缺省时是从右往左给,并且不能有间隔。

3.缺省值必须是常量或者全局变量。

四、函数重载

函数重载即一词多义,让使用更加方便

函数重载的要求:

1.在同一作用域中

2.同名函数

3.参数列表必须不同(参数的个数或类型或顺序)

注意:

只有返回值不同时,不构成重载

只有形参的名称不同,也不构成重载

1.下面两个函数能形成函数重载吗?有问题吗或者什么情况下会出问题?

以下是运行报错

不构成函数重载,两个Func的区别是有没有给形参a缺省值,想构成函数重载对于参数的条件是: 形参的个数、类型或顺序不同,这里不符合重载的条件,所以两个其实是同一个函数,Func重复定义,报错无法运行。

当一个参数为int,一个为int&,两函数构成重载,但是调用时会有歧义。

 以下这种情况构成重载,第一个add可以运行成功,但是第二个不可以

void add(int x = 0,int y = 0,int z = 0)
{return x+y+z;
}
void add(int x = 0, int y = 0)
{    return x+y;
}int main()
{add(1,2,3);add(1,2);return 0;
}

六、引用

引用不是新定义一个变量,而是给已存在的变量取别名,编译器不会为引用出来的别名开辟内存空间,而是让别名和它引用的变量共用一块内存空间。(可通过取地址看出)

类型&引用变量名(对象名) = 引用实体;

引用类型和引用实体必须是同种类型。

引用的特性:

1.引用在定义时必须初始化(不能写成NULL)

2.一个变量可以有多个引用

3.引用一旦引用一个实体,就不能再去引用其他实体。(即作为一个变量的别名后,不能再作为其他变量的别名)。

引用在做参数或做返回值时,可以减少拷贝,提高效率,可以更好地节省空间和时间,尤其是在处理大的对象时。

深拷贝时不用引用的话,效率会比较低。

引用还可以用作swap交换

void swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}

指针和引用的区别

指针和引用基本相似,但二者在使用场景、语法特性、底层原理上还是有区别的。

引用和指针的不同点:

1.引用在定义时必须初始化,指针没有要求。

2.引用在初始化引用一个实体后,就不能再引用其他实体了,而一般指针可以在任何时候指向任何一个同类型实体。

3.没有空引用,但是有空指针。

4.在sizeof中的定义不同,计算引用的结果为其所引用类型的大小,而指针始终是地址空间所占的字节数(4/8)。

5.引用自增时,是引用的实体自增1,指针则是向后偏移一个类型的大小。

6.有多级指针,但是没有多级引用。

7.访问实体的方式不同,指针需要显式解引用来访问,引用是编译器自己处理,大多可以直接访问。

8.引用比指针更安全。

9.指针需要开辟空间,引用不用开辟空间(实际在其汇编实现中,引用的底层是有类似指针存地址的方式做处理的)

10.一般传参时,引用的效率更高。当参数和返回值是比较大的变量时,传引用传参和传引用做返回值还可以提高效率,只要符合条件,尽量用引用传参传返回值,并且可以避免一些深拷贝

在链式结构时,引用无法代替指针。因为引用定义时必须初始化,并且引用不能改变指向。

从语法角度而言,引用没有开空间,指针开了4/8个字节。在底层实现的角度,引用的底层是用指针实现的。

注意:

1.是否能引用要注意访问权限大小。权限可以缩小,但是不能放大。

const int a = 10;//只读,是属于不能修改的
int& ra = a;//这样做是不行的,ra引用a属于权限放大。
//改成const int &ra = a;这样可以int b = 10;
int& rb = b;//可以
const int& crb = b;//属于权限的缩小,可以int c = 10;
double d = 1.11;
d = c;//可以,这里属于隐式类型转换
//权限的平移
int a = 10;
int& b = a;//权限放大
const int c = 20;
int& d = c;//不可以
//应该写成
const int& d = c;
//这样不可以
d = 10;int e = 5;
const int& f = e;//可以,属于权限的缩小

2.const&有很强的接收度。一般使用数据时,即使有const,也无关权限,权限的放大和缩小只针对引用和指针。

int i = 1;
double b = i;//这里会发生隐式类型转换
double& r = i;//不可以,因为这种类型转换中间会产生一个临时变量的,临时i把值给临时变量,临时变量把给r,而临时变量具有常性,r属于非const的,这里属于权限放大,是不允许的
const double& rr = i;//可以

3.

int a = 10;
int& b = a;
int x = 15;
b = x;
这里不是把b作为x的别名,而是把x的值赋给b所引用的实体(a)。
(b已经是a的实体,就不能再用它去引用其他人了) 

七、隐式类型转换 

int c = 10;
double d = 1.11;
d = c;//可以,这里属于隐式类型转换

不是直接把c给d,而是产生一个临时变量,然后把临时变量给d

int c = 10;
double d = 1.11;
d = c;//可以,这里属于隐式类型转换
double& rc = c;//不可以
const double& brc = c;//可以
//这里rc、brc引用的并不是c(即并不是c的别名),而是c产生的临时变量,临时变量具有常性,所以加const。(该临时变量类型为double)

强制类型转换和隐式类型转换基本一样,因为他们都会产生临时变量,它们都是不改变c本身的,都是产生临时变量的。并且它们转换都不会影响c(不论是c的类型还是什么)。

int& add(int a, int b)
{int c = a + b;return c;
}int main()
{int& ret = add(1,2);//这样是编不过的return 0;
}

此时临时变量的类型为int&。传值返回返回的是c的拷贝,传引用返回返回的是c的引用

实际上,如果出了函数作用域,返回变量就不存在了,不能用引用返回

传值返回也会给值创建一个临时变量,例如return c;会创建一个c的临时变量,然后将临时变量返回。那么怎么证明它产生了临时变量呢?

int add(int a, int b)
{int c = a + b;return c;
}int main()
{int& ret = add(1,2);//这样是编不过的const int& ret = add(1,2);//这样可以return 0;
}

因为临时变量具有常性,所以加了const才能编过

当参数和返回值是比较大的变量时,传引用传参和传引用做返回值还可以提高效率,只要符合条件,尽量用引用传参做返回值,引用传参还可以避免一些深拷贝

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

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

相关文章

STM32CUBUMX配置RS485(中断接收)--保姆级教程

———————————————————————————————————— ⏩ 大家好哇&#xff01;我是小光&#xff0c;嵌入式爱好者&#xff0c;一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子&#xff0c;使用STM32CUBEMX做了很多驱动&#x…

Vue mixin 混入

可以复用的组件&#xff0c;我们一般会抽离&#xff0c;写成公共的模块。 可以复用的方法&#xff0c;我们一般会抽离&#xff0c;写成公共的函数。 那么 在 Vue 中&#xff0c;如果 某几个组件实例 VueComponent 中、或者 整个 Vue 项目中 都存在相同的配置&#xff0c;那就…

firefox笔记-Centos7离线安装firefox

目前&#xff08;2023-03-22 16:41:35&#xff09;Centos7自带的firefox已经很新了是2020年的。主要原因是有个web项目&#xff0c;用2020年的firefox打不开。 发到互联网上是2023-07-24。 报错是js有问题&#xff0c;估计是搞前端的只做了chrome适应&#xff0c;没做firefox…

Spring使用注解进行对象装配(DI)

文章目录 一. 什么是对象装配二. 三种注入方式1. 属性注入2. 构造方法注入3. Setter注入 三. 三种注入方式的优缺点四. 综合练习 通过五大类注解可以更便捷的将对象存储到 Spring 中&#xff0c;同样也可以使用注解将已经储存的对象取出来&#xff0c;直接赋值到注解所在类的一…

ATTO488 NHS ester ,新型亲水性荧光标记物,具有良好的水溶性

陕西新研博美生物科技有限公司MISS.wu小编&#xff08;2023.7月26日&#xff09;为大家整理以下的内容&#xff1a; Atto488-NHS是一种新型亲水性荧光标记物&#xff0c;具有良好的水溶性。这种染料表现得很浓吸收、高荧光量子产率以及优异的热稳定性和光稳定性。因此&#xff…

亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单

在电商领域&#xff0c;补单是一种常见的推广方式。它能够优化商品销售、留下优质评论、打压竞品和赶走跟卖等&#xff0c;具有很多好处。然而&#xff0c;补单也存在安全性问题&#xff0c;有些卖家找人补单后店铺反而出了问题。因此&#xff0c;了解测评系统是非常重要的的。…

android9-android13 AMS演进初窥

目录 一&#xff1a;概览 WindowManagerService 基本介绍 ActivityManagerService 基本介绍 二&#xff1a;AMS及其关联的WMS中主要组件的类图和对像图 一&#xff1a;android 9中AMS/WMS的类图和对像图 二&#xff1a;android 10中AMS/WMS的类图和对像图 三&#xff1a…

关于应用在Google Play的元数据优化

应用标题中的关键词权重最大&#xff0c;其次是简短描述中的关键词&#xff0c;最后是长描述关键词&#xff0c;了解这些就能够很好的提高应用的可见度&#xff0c;下载量和整体成功率。 1&#xff0c;标题。 Google Play最多允许标题容纳30个字符&#xff0c;关键词的频率和密…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大&#xff0c;业务逐渐复杂化&#xff0c;项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具&#xff0c;项目管理软件不仅可以提高工作效率&#xff0c;还可以提高项目成功的几率&#xff0c;对于企业具有重要…

Unity进阶--对象池数据场景管理器笔记

文章目录 泛型单例类泛型单例类&#xff08;不带组件版&#xff09;对象池管理器数据管理器场景管理器 泛型单例类 using System.Collections; using System.Collections.Generic;public abstract class ManagersSingle<T> where T : new() {private static T instance;…

DevExpress WPF Tree List组件,让数据可视化程度更高!(一)

DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体&#xff0c;可以把数据信息显示为REE、GRID或两者的组合&#xff0c;在数据绑定或非绑定模式下&#xff0c;具有完整的数据编辑支持。 DevExpress WPF 拥有120个控件和库&#xff0c;将帮助您…

验证码登录如何实现?

手机验证码登录 1、需求分析2、数据模型3、代码开发-交互过程4、代码开发-准备工作5、代码开发-修改LoginCheckFilter6、代码开发-接口开发7、前端代码介绍8、启动测试 1、需求分析 为了方便用户登录&#xff0c;移动端通常都会提供通过手机验证码登录的功能。 手机验证码登录…

手边酒店多商户版小程序V1.0.47 全开源版 安装测试教程

手边酒店多商户小程序是基于框架应用模块应用&#xff0c;需要框架基础上使用&#xff0c;总体体验了一下功能还是强大&#xff0c;非常合适酒店及民宿类小程序搭建。小程序端支持多店版支持平台入驻。手边酒店多商户版只有模块版&#xff0c;无独立版本&#xff0c;该版本核心…

Rust vs Go:常用语法对比(十)

题图来自 Rust vs. Golang: Which One is Better?[1] 182. Quine program Output the source of the program. 输出程序的源代码 package mainimport "fmt"func main() { fmt.Printf("%s%c%s%c\n", s, 0x60, s, 0x60)}var s package mainimport "fm…

桥梁安全生命周期监测解决方案

一、方案背景 建筑安全是人们生产、经营、居住等经济生活和人身安全的基本保证&#xff0c;目前我国越来越多的建筑物逐 步接近或者已经达到了使用年限&#xff0c;使得建筑物不断出现各种安全隐患&#xff0c;对居民的人身安全和财产安全产 生不利影响&#xff0c;因此房…

Bug竞技场【已经修复】

目录 1.基础知识 2.最佳组合 2.1 铁男-螳螂 2.2 弟弟组合 海克斯抽卡bug 1.基础知识 背景&#xff1a;美测服-美服-马服-可以有效地减少bug率 复盘是为了更好的战斗&#xff01; 提前观看一些视频资料也是如此。 通过看直播博主的经验&#xff0c;可以让你关注到本来对战的…

Python 生成随机图片验证码

使用Python生成图片验证码 Python 生成随机图片验证码安装pillow包pillow包生成图片基本用法生成图片验证码 Python 生成随机图片验证码 在写一个Web项目的时候一般要写登录操作&#xff0c;而为了安全起见&#xff0c;现在的登录功能都会加上输入图片验证码这一功能&#xff…

结构型设计模式之组合模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

Hadoop学习日记-MapReduce思想及执行流程

MapReduce思想 Map负责“拆分”&#xff1a;即将复杂问题拆分成可以并行计算的小问题&#xff0c;彼此之间几乎没有依赖联系。 Reduce负责对Map阶段的结果进行合并汇总 Map和Reduce的抽象接口如下&#xff1a; map:(k1; v1) — (k2; v2) reduce:(k2; [v2]) — (k3; v3) 一…

看了2023年的一线互联网公司时薪排行榜!值得思考

前言 根据最近针对国内的一线互联网企业做的调研&#xff0c;汇总了他们的平均时薪水平&#xff0c;最终出了一个排行榜&#xff01; 首先我们来看下&#xff0c;排行榜分哪几个Level&#xff0c;分别为初级、中级、高级、资深、专家/架构这五个&#xff0c;主要根据工程师的…