【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日,元宇宙标准化工作组成立大会暨第一次全体委员会议在浙江省丽水市青田县召开。元宇宙标准化工作组的建立&#…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...