【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日,元宇宙标准化工作组成立大会暨第一次全体委员会议在浙江省丽水市青田县召开。元宇宙标准化工作组的建立&#…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...