【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环
目录
命名空间
命名空间的定义
命名空间的使用
输入输出
缺省参数
函数重载
引用
常引用
引用的使用场景
内联函数
auto
基于范围的for循环
命名空间
请看一段C语言的代码:
#include <stdio.h>
#include <stdlib.h>int rand = 10;int main()
{printf("%d ", rand);return 0;
}
运行结果:
这就是自己定义的变量和库里面的函数冲突了,C语言无法解决这类问题,C++中的命名空间就是为解决这一类问题而生的。
命名空间存在的重要意义就是为了避免命名冲突。接下来我们先了解命名空间的定义,再使用命名空间去解决这类问题。
命名空间的定义
命名空间的定义需要用到关键字namespace,格式为:
namespace 命名空间的名字
{
/ /……
}
例如:
namespace pcz
{int Add(int x, int y){return x + y;}
}
命名空间中可以定义变量、函数、类等。
命名空间的使用
首先,用命名空间来解决上述命名冲突的问题。
namespace pcz
{int rand = 20;//把变量放到自己的命名空间里
}int main()
{printf("%d ", pcz::rand);return 0;
}
运行结果:

这回就没问题了。 上述代码中的符号 :: 是作用域限定符,因为在我们定义一个命名空间时,就定义了一个新的作用域,限定符前面的内容就是在告诉编译器到哪去找相应的变量、函数以及类。如果作用域限定符前面啥也没写,那么就默认到局部和全局中去找对应的变量,不会到命名空间里找。
命名空间支持嵌套。
namespace pcz
{int rand = 20;namespace ch{int Add(int x, int y){return x + y;}}
}int main()
{printf("%d ", pcz::rand);printf("%d ", pcz::ch::Add(1, 2));return 0;
}
命名空间的三种使用方式
一、用作用域限定符进行访问
二、全局展开——using namespace std;
三、部分展开——using std::cout;
输入输出
使用标准输出对象cout(控制台)和标准输入对象(键盘)时,必须包含头文件<iostream>,以及对应的命名空间。
#include <iostream>
using namespace std;int main()
{int i = 0;cin >> i;cout << i;return 0;
}
<< : 流插入运算符
>> : 流提取运算符
cin、cout的可以自动识别类型,不用在像C语言一样需要占位符%d、%f等。
缺省参数
缺省参数是声明或定义函数时为函数的参数指定一个缺省值(默认值)。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。缺省参数可以分为全缺省参数和半缺省参数两种。
例如:
#include <iostream>
using namespace std;int Add(int x = 1, int y = 1)
{return x + y;
}int main()
{cout << Add() << endl;return 0;
}
缺省值的使用应注意以下几个事项:
一、半缺省参数必须依次从右往左给,不能间隔给
正确写法:
#include <iostream>
using namespace std;int Add(int x, int y = 1)
{return x + y;
}int main()
{cout << Add(2) << endl;return 0;
}
错误写法:
#include <iostream>
using namespace std;int Add(int x = 3, int y)
{return x + y;
}int main()
{cout << Add(2) << endl;return 0;
}

二、缺省参数不能再函数声明和定义是同时出现,如果遇到声明和定义分离,那就在声明时给缺省值
三、缺省值必须是常量或者全局变量
四、C语言不支持
函数重载
函数重载是C++的一个特性,允许在同一个作用域中定义多个同名函数,但这些函数的参数列表必须不同。编译器通过函数的参数列表来区分各个重载的函数。参数列表不同包括:参数个数不同、参数类型不同、参数顺序不同。
通过函数名修饰后,同名但不同参数列表的函数经修饰后的函数名不同,这样编译器就可以区分重载函数。C语言不支持重载函数,C语言函数名的存储是直接转换使用函数名,所以不支持重载。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。
#include <iostream>
using namespace std;int Add(int x, int y)
{return x + y;
}double Add(double x, double y)
{return x + y;
}int main()
{cout << Add(1, 1) << endl;cout << Add(1.2, 1.4) << endl;return 0;
}
引用
引用是给已存在变量取了一个别名,引用改变,实体也跟着改变,格式为:类型& 。注意,引用类型必须和引用实体是同种类型。
示例:
int main()
{int a = 1;int& b = a;return 0;
}
引用的特性
一、引用在定义时必须初始化
二、一个变量可以有多个引用
三、引用一旦引用一个实体,再也不能引用其他实体了
第一个特性的演示:
int main()
{int a = 1;int& b; //未初始化引用return 0;
}

第三个特性演示:
int main()
{int a = 1;int& b = a;int c = 20;b = c;//此处不是在改变b的引用实体,而是把c的值赋给acout << a << endl;return 0;
}

常引用
int main()
{const int a = 1;int& b = a;return 0;
}
运行结果:
这里涉及到了权限的问题。
在指针和引用中,赋值或者初始化时,权限可以保持或缩小,但不能放大。
正确写法:
int main()
{const int a = 1;const int& b = a;return 0;
}
引用的使用场景
一、做参数
void Swap(int& a, int& b)
{int tmp = a;a = b;b = tmp;
二、做返回值
int& Count()
{static int n = 0;n++;// ...return n;
}
如果出了函数作用域,返回对象还未还给操作系统,则可以用引用返回。否则,使用传值返回。
三、传值和传引用的效率分析
作为函数参数时,如果传值,函数不会直接传递实参本身,而是传递实参的一份临时拷贝。
作为返回值时,如果传值,也不会将变量直接返回,而是返回它的一份临时拷贝。
因此,传值的效率是比较低的,尤其是参数和返回值类型较大的时候。
如果传引用,因为引用是被引用实体的别名,不会进行拷贝,所以效率较高。
引用和指针的不同点
一、引用概念上定义一个变量的别名,指针存储一个变量的地址。
二、引用在定义是必须初始化,指针没有要求。
三、引用在初始化时引用一个实体后,就不能再引用其他实体了,而指针可以在任何时候改变指向。
四、没有NULL引用,但有NULL指针。
五、在sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占的字节数。
六、引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小。
七、有多级指针,但没有多级引用。
八、访问实体方式不同,指针需要显式解引用,引用编译器自己处理。
九、引用比指针使用起来更安全。
内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,提升程序运行的效率。缺点是:可能会使目标文件变大。
inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同。
适用:函数规模小、非递归、频繁调用。
内联函数不建议声明和定义分离,因为内联函数会在调用的地方展开,没有地址,如果声明和定义分离,那么在链接的时候会报错。
auto
自动推到类型。
int main()
{auto i = 10;cout << i << endl;return 0;
}
注意事项:
使用auto定义变量时,必须对其进行初始化,编译器会根据初始化表达式自动推到它的实际类型,然后会用实际类型替换auto。
auto与指针和引用结合起来使用:
int main()
{int x = 0;auto a = &x;auto* b = &x;auto& c = x;return 0;
}
用auto声明指针类型时,auto和auto*没有区别,但声明引用时,必须加上&。
int main()
{auto a = 1, b = 2, 4;return 0;
}
以上这种写法是错误的。在同一行定义多个变量时,这些变量必须是相同的类型,否则编译器会报错。因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
auto不能作为函数的参数。
auto不能用来声明数组。
基于范围的for循环
传统遍历数组的方式:
int main()
{int array[] = { 1,2,3,4,5,6 };int n = sizeof(array) / sizeof(int);for (int i = 0; i < n; i++){cout << array[i] << endl;}return 0;
}
范围for:
int main()
{int array[] = { 1,2,3,4,5,6 };int n = sizeof(array) / sizeof(int);for (auto e : array){cout << e << endl;}return 0;
}
for循环后的括号由 :分成两部分,第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
完
相关文章:
【C++入门】输入输出、命名空间、缺省参数、函数重载、引用、内联函数、auto、基于范围的for循环
目录 命名空间 命名空间的定义 命名空间的使用 输入输出 缺省参数 函数重载 引用 常引用 引用的使用场景 内联函数 auto 基于范围的for循环 命名空间 请看一段C语言的代码: #include <stdio.h> #include <stdlib.h>int rand 10;int main…...
Docker + Nginx 安装
安装Docker 1.防火墙 2.yum源 3.安装基础软件 更新yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum clean all #清除yum源缓存 yu…...
UE RPC 外网联机(1)
技术:RPC TCP通信 设计:大厅服务<---TCP--->房间服务<---RPC--->客户端(Creator / Participator) 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 (1)RPC&a…...
AI预测福彩3D第22弹【2024年3月31日预测--第5套算法开始计算第4次测试】
今天,咱们继续进行本套算法的测试,今天为第四次测试,仍旧是采用冷温热趋势结合AI模型进行预测。好了,废话不多说了。直接上结果~ 仍旧是分为两个方案,1大1小。 经过人工神经网络计算并进行权重赋值打分后,3…...
Django(二)-搭建第一个应用(1)
一、项目环境和结构 1、项目环境 2、项目结构 二、编写项目 1、创建模型 代码示例: import datetimefrom django.db import models from django.utils import timezone# Create your models here.class Question(models.Model):question_text models.CharField(max_length2…...
前端bugs
问题: Failed to load plugin typescript-eslint declared in package.json eslint-config-react-app#overrides[0]: Cannot find module eslint/package.json 解决: google了一晚上还得是chatgpt管用 运行以下命令【同时还要注意项目本身使用的Node版…...
MCGS学习——水位控制
要求 插入一个水罐,液位最大值为37插入一个滑动输入器,用来调节水罐水位,滑动输入器最大调节为液位最大值,并能清楚的显示出液位情况用仪表显示水位变化情况,仪表最大显示设置直观清楚方便读数,主划线为小…...
本地搭建多人协作ONLYOFFICE文档服务器并结合Cpolar内网穿透实现公网访问远程办公
文章目录 1. 安装Docker2. 本地安装部署ONLYOFFICE3. 安装cpolar内网穿透4. 固定OnlyOffice公网地址 本篇文章讲解如何使用Docker在本地服务器上安装ONLYOFFICE,并结合cpolar内网穿透实现公网访问。 Community Edition允许您在本地服务器上安装ONLYOFFICE文档&…...
Ubuntu 中电子邮件处理工具
Ubuntu 中电子邮件处理工具的综述 在现代通信技术中,电子邮件系统是不可或缺的一部分。特别是在基于 Linux 的操作系统如 Ubuntu 中,有许多高效且可靠的电子邮件处理工具可供选择。除了众所周知的 Postfix,还有其他几个重要的选项࿰…...
java多线程——运用线程同步解决线程安全问题
前言: 整理下学习笔记,打好基础,daydayup!!! 线程安全 多线程可以同时进行操作,但如果是同时操作一个共享资源的时候,可能会出现业务安全问题。 示例: 小A和小B共用一个账户,如果小A和小B同时取…...
Radio Silence for mac 好用的防火墙软件
Radio Silence for Mac是一款功能强大的网络防火墙软件,专为Mac用户设计,旨在保护用户的隐私和网络安全。它具备实时网络监视和控制功能,可以精确显示每个网络连接的状态,让用户轻松掌握网络活动情况。 软件下载:Radio…...
全国青少年软件编程(Python)等级考试一级考试真题2023年9月——持续更新.....
青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 一、单选题(共25题,共50分) 1.下列 Python 语句能够正确输出"学而时习之"五个字的是?( )A.print “学而时习之” B.print “(学而时习之)” C.print (“学而时习之”) D.print (学而时习之) 标…...
TCP通信——端口转发(重点内容)
实现多人群聊 Client(客户端)建立通信 package com.zz.tcp.case1;import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.util.Scanner;public class Client {public static void mai…...
乐乐音乐鸿蒙版-支持krc歌词(动感歌词、翻译和音译歌词)
简介 乐乐音乐主要是基于HarmonyOS开发的音乐播放器,它支持lrc歌词和动感歌词(ksc歌词、krc歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 开发环境 ArkTS、Stage模型、SDK3.1、 API 9 注:没试过在真机条件下调试。 功…...
批量删除 rabbitmq中随机队列
批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列,需要批量删除 进入MQ集群中 docker psdocker exec -it c2d28e816894 /bin/bash过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^…...
docker 数据卷
Docker数据卷是Docker中的一个核心机制,用于实现容器间数据的持久化和共享。它是宿主机上的一个特殊目录,可以供一个或多个容器使用。容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。 …...
【开发工具】Ubuntu复制CSDN代码多余符号的去除
在Ubuntu中使用CSDN复制的代码时,可能会出现\u200的符号,这个符号会影响代码的编译和运行,因此需要找到一种快速删除这种符号的方法。 通过搜索找到了一种替换为空的删除方式,笔者编写了一个适用于Rust的shell脚本,需要…...
【微服务篇】深入理解微服务注册中心与配置中心
注册中心 设计一个注册中心时,需要关注多个关键方面,以确保其稳定性、可靠性、性能和可扩展性。以下是一些重要的考虑因素: 服务发现机制:注册中心的核心功能是允许服务相互发现。这意味着当一个服务实例启动时,它需…...
数据库安全(redis、couchdb、h2database)CVE复现
redis服务默认端口:6379;我们可以通过端口扫描来判断是否存在该服务。 Redis 是一套开源的使用ANSI C 编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库,并提供多种语言的API。 Redis 如果在没有开启认证的情况下,…...
道可云元宇宙每日资讯|元宇宙标准化工作组成立大会召开
道可云元宇宙每日简报(2024年3月28日)讯,今日元宇宙新鲜事有: 元宇宙标准化工作组成立大会召开 3月21日,元宇宙标准化工作组成立大会暨第一次全体委员会议在浙江省丽水市青田县召开。元宇宙标准化工作组的建立&#…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
