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

news2024/10/6 18:32:18

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

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

一、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.coloradmin.cn/o/791521.html

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

相关文章

初阶C语言-分支和循环语句(下)

“花会沿途盛开&#xff0c;以后的路也是。” 今天我们一起来继续学完分支语句和循环语句。 分支和循环 3.循环语句3.4 do...while()循环3.4.1 do语句的用法 3.5关于循环的一些练习3.6 goto语句 3.循环语句 3.4 do…while()循环 3.4.1 do语句的用法 do循环语句;//当循环语句…

【unity】ShaderGraph学习笔记

【unity】ShaderGraph学习笔记 创建ShaderGraph 创建URP的shaderGraph文件 在Project面板里Create→ShaderGraph→URP→这里主要有几个选项 Lit Shader Graph&#xff1a;有光照三维着色器 Unlit Shader Graph&#xff1a;无光照三维着色器 Sprite Custom Lit Shader Gra…

【解决方案】医疗行业资产定位管理方案-蓝牙资产定位方案

蓝牙资产定位追踪技术已经开始应用于多种行业的资产、设备管理方面&#xff0c;有不少机构、企业开始尝试使用实时蓝牙定位系统对其各类资产、机器设备、工具、材料、产品等进行精准定位&#xff0c;提高各类资产、设备的管理和使用效率&#xff0c;从而节省运营成本。 医疗行业…

汽配企业建设数字化工厂的步骤是什么

随着信息技术的迅猛发展&#xff0c;汽车行业也面临着数字化转型的迫切需求。汽配企业作为汽车产业链上重要的一环&#xff0c;也需要积极采取措施&#xff0c;建设数字化工厂系统&#xff0c;以适应市场竞争的变化。下面将介绍建设汽配企业数字化工厂的具体步骤。 第一步&…

在niso ii中读写EPCS时出现“Can‘t open flash device”

在niso ii中读写EPCS时出现“Can’t open flash device”&#xff0c;即alt_flash_open_dev(EPCS_FLASH_NAME)函数返回0。 Cant open flash device函数alt_flash_open_dev(EPCS_FLASH_NAME)打开epcs不成功&#xff0c;返回为0&#xff0c;试了几次硬件重新烧入、重启开发板还是…

呕心沥血解决xampp启动mysql异常停止due to a blocked port, missing dependencies问题

Error: MySQL shutdown unexpectedly.<br> This may be due to a blocked port, missing dependencies 这一行就是我问题的开始。 原因是因为&#xff0c;之前一直使用xampp用作本地mysql的启动管理&#xff0c;是个很好用的工具&#xff0c;但是近日想要给一个项目配…

STM32速成笔记—串口IAP

本文涉及到串口通信和Flash知识&#xff0c;对于这部分知识不熟悉的小伙伴可以到博主STM32速成笔记专栏查看。 文章目录 一、串口IAP简介1.1 什么是IAP1.2 STM32下载程序 二、串口IAP有什么作用三、启动流程3.1 正常启动流程3.2 加入IAP后的启动流程 四、必备知识4.1 修改程序运…

日常开发中Git遇到的问题-记录贴

日常开发中Git遇到的问题 前言场景一&#xff1a;clone代码并进行开发完毕后&#xff0c;进行代码合并时要求在新分支下提交代码场景二&#xff1a;远程分支被删除后&#xff0c;本地分支缓存需要更新&#xff0c;防止提交错误 前言 本篇博客只是用来记录平时开发过程之中用gi…

从头开始:数据结构和算法入门(时间复杂度、空间复杂度)

目录 文章目录 前言 1.算法效率 1.1 如何衡量一个算法的好坏 1.2 算法的复杂度 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见时间复杂度计算 3.空间复杂度 4.常见复杂度对比 总结 前言 C语言的学习篇已经结束&#xff0c;今天开启新的篇章——数据结构和算…

Hive视图

hive的视图 简介 hive的视图简单理解为逻辑上的表hive只支持逻辑视图&#xff0c;不支持物化视图视图存在的意义 对数据进行局部暴露&#xff08;涉及隐私的数据不暴露&#xff09;简化复杂查询 创建视图&#xff1a; create view if not exists v_1 as select uid,movie f…

国内十大精准的现货黄金价格走势图软件最新排名(综合版)

选择国内现货黄金价格走势图软件时&#xff0c;需要考虑几个因素。首先&#xff0c;软件的稳定性和可靠性至关重要。应选择有良好声誉和长期稳定运行的平台&#xff0c;以确保价格数据的准确性和及时性。其次&#xff0c;要选择功能齐全的软件。较为优秀的软件应该提供多种技术…

C++学习——类和对象(三)

接着我们就继续学习我们C当中的相关的知识。 一&#xff1a;初始化列表 还记得我们之前讲过的构造函数吗&#xff1f;我们在构造函数的函数体里面可以对对象当中的属性进行初始化。但是作为我们的构造函数来说&#xff0c;初始化的方式并不只是在构造函数体当中进行赋值。我们…

Junit4+MultiThreadedTestRunner 并发测试

目录 前言&#xff1a; 具体步骤&#xff1a; 前言&#xff1a; 在进行软件测试时&#xff0c;我们需要确保应用程序在不同的并发情况下仍能正常运行。 最近要对一个类里的方法&#xff0c;进行压力测试。下面讲一下写出的 Junit4 的并发测试代码吧。如果要复用的话&#x…

通达信一看就懂的成交量指标公式_通达信公式

用法说明&#xff1a;黄色为立桩量&#xff0c;绿色长竖条为逃顶提示&#xff0c;蓝色与红箭头为突破&#xff0c;红色为牛&#xff0c;紫色为立桩三天法则成立&#xff0c;笑脸为寻底&#xff0c;棕色与绿箭头为破位&#xff0c;淡红色黑中线涨停&#xff0c;深绿色黑中线跌停…

yolov7裂缝检测

B站视频笔记。 1.首先到Github上找RoboFlow的仓库地址 该教程提供了传统算法比如Resnet、YOLO等&#xff0c;还有包含一些较新的算法。 2.通过Colab打开例程 可以直接通过Colab打开,还支持其他的打开方式&#xff0c;这里提供三种方式。 提示&#xff1a;点击授权即可。 …

dy设备deviceid iid注册分析

清楚缓存&#xff0c;重新打开app, 点击同意按钮&#xff0c;会触发设备注册&#xff1b; 很明显是一个post包&#xff0c;device_register 可以看到请求体加密了 那么 请求体是什么呢&#xff1f; 很老版本思路&#xff1a;都是直接明文注册 较老版本思路&#xff1a;在反编译…

二、SQL-5.DQL-8).案例练习

1、查询年龄为20,21,22,23岁的员工信息 select * from emp where age in(20, 21, 22, 23) and gender 女; 2、查询性别为男&#xff0c;并且年龄在20-40岁&#xff08;含&#xff09;以内的姓名为三个字的员工 select * from emp where gender 男 && age between 2…

如何从任何地方远程解决电脑问题?

​如何远程解决电脑问题&#xff1f; “嗨&#xff01;我有一台Windows 10家用电脑。我外出旅行&#xff0c;但我的家人告诉我我的电脑有一段时间无法正常工作。我该如何远程检查电脑并解决相应的问题&#xff1f;提前谢谢&#xff01;” 您是否正在寻找远程解决电…

重庆市北斗新型智慧城市政府项目

技术栈&#xff1a;使用vue2JavaScriptElementUIvuexaxiosmapboxcesium 项目描述&#xff1a;重庆市北斗新型智慧城市政府项目是基于千寻孪界开发的一款智慧城市项目&#xff0c;包含车辆实时位置定位&#xff0c;智能设备的报警&#xff0c;基础设施的部设等等功能 工作内容&a…

javascript 7种继承-- 寄生式继承分析(5)

文章目录 概要继承的进化史技术名词解释寄生式继承案列分析源代码解析效果图小结 概要 这阵子在整理JS的7种继承方式&#xff0c;发现很多文章跟视频&#xff0c;讲解后都不能让自己理解清晰&#xff0c;索性自己记录一下&#xff0c;希望个位发表需要修改的意见&#xff0c;共…