C++入门预备语法
C++入门预备语法
- C++关键字
- 命名空间
- C++输入&输出初步
- 缺省参数
- 函数重载
- 引用
- 内联函数
- auto和范围for(C++11)
- 指针空值nullptr
C++关键字
命名空间
命名空间是一种将变量名、函数名、类名和库名称等封装到一个命名空间域中,与其他域的同名量相隔离,进而避免程序中的代码出现命名冲突的方法。
命名空间关键字 namespace
命名空间的定义:
//定义命名空间,namespace后面的名字是自定义的
//1. 普通的命名空间
namespace YT // YT为命名空间的名称
{// 命名空间中的内容,既可以定义变量,也可以定义函数int a;int Add(int left, int right){return left + right;}
}//2. 命名空间可以嵌套
namespace YT1
{int a;int b;int Add(int left, int right){return left + right;}namespace YT2{int c;int d;int Sub(int left, int right){return left - right;}]
}
【注意】: 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中,即 同名的命名空间会合并。
未命名命名空间:
namespace后面不加名字,直接使用花括号包含声明块。
//例如:
// --- Swap.cpp ---
namespace
{void Swap(int* v1, int* v2){ /* ... */}
}
函数Swap()被定义在未命名命名空间里,则仅在Swap.cpp这个文件中可见,且可以直接使用。如果另一个文件中也含有一个带有函数Swap()的未命名命名空间,则这两个函数是不同的函数。
命名空间的使用方法:
:: 域作用限定符 ::的左操作数是你要指定的域,右边是你要访问的域中的变量名
(::左边默认是到全局域中访问)
1、使用 using namespace 命名空间名 来直接完全展开命名空间。
#include <iostream>
using namespace std;int main()
{cout << "Hello World" << endl;return 0;
}
(但这样会使命名空间丧失封装隔绝的作用,项目中不建议这样展开)
2、使用域作用限定符:: 指定访问
#include <iostream>int main()
{std::cout << "Hello World" << endl;return 0;
}
3、使用 using 将命名空间中的成员展开
#include <iostream>
using std::cout;int main()
{cout << "Hello World" << endl;return 0;
}
C++输入&输出初步
C++的输入/输出功能由输入/输出流(iostream)库提供。
在C++语言层面:
标准输出cout:直接向终端输出
标准输入cin:由终端输入
标准错误cerr:产生给程序用户的警告和错误信息
任何想要使用iostream库的程序必须包含相关的系统头文件:#include < iostream >
流插入运算符<< 用来将一个值导入到标准输出cout或标准错误cerr中
流提取运算符>> 用来从标准输入cin中读入一个值
缺省参数
概念:缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,指定了则使用指定的实参。
void TestFunc(int a = 0) // 0就是a的缺省值
{cout<<a<<endl;
}int main()
{TestFunc(); // 没有传参时,使用参数的默认值TestFunc(10); // 传参时,使用指定的实参
}
缺省参数分类:
全缺省函数:
void TestFunc(int a = 10, int b = 20, int c = 30)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}
半缺省函数:
void TestFunc(int a, int b = 10, int c = 20)
{cout<<"a = "<<a<<endl;cout<<"b = "<<b<<endl;cout<<"c = "<<c<<endl;
}
半缺省参数必须从右往左依次来给出,不能间隔着给
【注意】:1、 缺省参数不能在函数声明和定义中同时出现,建议在函数声明中给缺省;
2、 缺省值必须是常量或者全局变量。
函数重载
C++中函数参数列表(参数个数、类型或顺序)不同的同名函数之间构成函数重载,构成重载的函数允许同时存在于一个作用域中。
【注】:函数的返回类型没有要求。
为什么C语言不支持函数重载,而C++支持呢?
这就涉及到文件的编译链接过程和函数名修饰规则。
文件编译之后,函数声明会被按照修饰规则处理成一串符号,链接过程中函数通过这串符号来进行链接。其中,C语言的修饰规则只取决于函数名,而C++的修饰规则由函数名、参数个数、参数类型及参数顺序共同决定。
引用
引用没有新定义一个变量,而是给已存在的变量取一个别名,没有开辟新的空间,引用和被引用的变量共用同一块内存空间。
基础用法: 类型& 对象名 = 引用实体
(注意:引用类型必须和引用实体是同种类型的)
引用的特性:
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,就不能再引用其他实体
引用的使用场景:
1、做函数参数:
- (i)输出型参数:引用做参数,实参与引用共用同一块空间,在看函数内部更改引用变量,外部的实参也会相应改变。
- (ii)传大对象或深拷贝类对象时引用做参数:传值传参,形参是实参的拷贝,而当实参占用的空间太大时这样就会造成大量空间浪费,而传引用就不会占用额外的空间。
2、做返回值
- (i)引用做返回值来减少拷贝;传值返回同样会生成一个返回值的临时拷贝,这个临时变量才将返回值传出去,如果返回值内存很大就会浪费空间,降低效率。
- (ii)引用做返回值可以修改返回值。
引用做返回值的条件: 返回值不会因为函数栈帧的销毁而受影响时才能使用引用做返回值。
传引用返回,传回来的是返回值所在的那块空间的引用,那块空间中的值被更改传回来的引用就会被更改,传引用返回不会产生临时变量。
引用和指针的区别:
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
- 没有空引用,但有空指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
- 引用自加即引用的实体增加1,指针自加则为指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用则是编译器自己处理
- 引用比指针使用起来相对更安全
内联函数
概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数可以提升程序运行的效率。
//在函数最开头加一个inline关键字即可使函数变为内联
inline int Add(int val1, int val2)
{return val1 + val2;
}
内联函数的使用特性:
- 内联函数适用于短小且频繁调用的函数,代码很长的函数或递归函数不适合变成内联;
- inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有递归或代码过长等,编译器优化时会忽略掉内联;
- 默认debug模式下内联函数不会起作用,因为不方便调试。
【注意】:使用内联函数不要将函数的声明和定义分离,直接在 .h文件中把整个函数写完。
auto和范围for(C++11)
类型指示符auto: 根据 = 右边的表达式自动推导 = 左边的变量类型。
(类型名很长时用auto替代很方便)
【注意】:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。
auto的使用细则:
1、用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&;
2、当在同一行定义多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
void TestAuto()
{auto a = 1, b = 2; auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
}
auto不能推导的场景:
- auto不能作为函数的参数
- auto不能直接用来声明数组
范围for:
范围for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void TestFor()
{int array[] = { 1, 2, 3, 4, 5 };for(auto& e : array)e *= 2;for(auto e : array)cout << e << " ";return 0;
}
【注意】:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。
范围for的使用条件:
- for循环迭代的范围必须是确定的。
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。 - 迭代的对象要实现++和==的操作。
指针空值nullptr
C++中使用 nullptr 表示指针空值。
相关文章:

C++入门预备语法
C入门预备语法 C关键字命名空间C输入&输出初步缺省参数函数重载引用内联函数auto和范围for(C11)指针空值nullptr C关键字 命名空间 命名空间是一种将变量名、函数名、类名和库名称等封装到一个命名空间域中,与其他域的同名量相隔离&…...
python发送email
通过第三方SMTP发送纯文本邮件 #!/usr/bin/python -- coding: UTF-8 -- import smtplib from email.mime.text import MIMEText from email.header import Header 第三方 SMTP 服务 mail_host“smtp.XXX.com” #设置服务器 mail_user“XXXX” #用户名 mail_pass“XXXXXX” …...

软件测试面试题自动化面经分享——这才是高薪的秘诀!
Hello,你们的好朋友来了!今天猜猜我给大家带来点啥干货呢?最近很多小伙伴出去面试的时候经常会被问到跟自动化测试相关的面试题。所以,今天特意给大家整理了一些经常被公司问到的自动化测试相关的面试题。停,咱先收藏起…...
Ceph入门到精通-Centos8安装prometheus
普罗米修斯是一个开源的监控、查询和警报工具。最初由Soundcloud于2012年构建,功能丰富的工具已被多家公司采用,用于监控其IT基础架构并确保所有系统平稳运行。Prometheus 允许您通过 HTTP 协议查询和提取时间序列指标,例如 CPU 和内存利用率,并在实时图表上可视化它们。您…...

把树莓派改造成无线网卡(3)-----共享无线网络,无线网络转换成有线网络,让有线网络设备连上无线网络
本文目录 1、准备工作2、安装DNS和配置管理软件3、设置网络路由功能3.1、树莓派的有线网络接口IP配置3.2、启用路由和IP伪装3.3、为有线网络配置DHCP和DNS服务 4、运行5、进阶--将二个以太网口加入到同一个网桥 现在的无线路由器非常便宜,所以实际上除了有特殊的要求…...

NumPy
目录 1、NumPy简介 2、利用元组、列表创建多维数组 3、数组索引 4、数组裁切 4.1、一维数组操作 4.2、二维数组操作 5、数据类型 6、副本/视图 7、数组形状 8、数组重塑 9、多维数组的迭代 10、数组连接 10.1、使用concatenate() 函数进行数组连接 10.2、使用堆栈…...
C++17完整导引-模板特性之类模板参数推导
模板特性之类模板参数推导 使用类模板参数推导默认以拷贝方式推导推导lambda的类型没有类模板部分参数推导使用类模板参数推导代替快捷函数 推导指引使用推导指引强制类型退化非模板推导指引推导指引VS构造函数显式推导指引聚合体的推导指引标准推导指引pair和tuple的推导指引从…...

CSS3小可爱亲吻表白特效,给你的五一假期增添点小乐趣
马上五一假期了,小伙伴们是不是都准备出去旅游呢,或者回老家陪陪父母。今天我用CSS3制作一个小可爱亲吻表白的特效,来给你即将到来的五一假期增添点小小的乐趣。 目录 实现思路 左边小可爱的实现 右边小可爱的实现 左右摇摆动效的实现 右…...
Samba CentOS 7 安装
安装步骤 Samba是在Linux与Windows系统间共享文件和打印机的标准协议。要在CentOS上安装Samba,可以按以下步骤操作: 安装Samba相关包: yum install samba samba-client samba-common创建Samba配置文件/etc/samba/smb.conf: vim /etc/samba/smb.conf添加如下配置: [global]…...

Mac电脑 Vscode : Flutter 开发环境搭建(最细节教程)
参考链接: MacVSCode安装flutter环境_mac vscode配置flutter_GalenWu的博客-CSDN博客 mac搭建Flutter环境以及初始化项目 - 简书 注意: *下载xcode 就包含git了, *苹果芯片和intel 芯片需要的环境不同,苹果芯片需要安装: Im…...

BEVFormer 论文学习
1. 解决了什么问题? 3D 视觉感知任务,包括基于多相机图像的 3D 目标检测和分割,对于自动驾驶系统非常重要。与基于 LiDAR 的方法相比,基于相机图像的方法能够检测到更远距离的目标,识别交通信号灯、交通标识等信息。有…...

现在的00后,实在是太卷了,我们这些老油条都想辞职了......
现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪20K,都快要超过我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家…...
shell 数组定义与使用
一维数组 数组定义 array_name(value1 value2 ... value)也可以使用数字下表来定义数组 array_name[0]value0 array_name[1]value1 array_name[2]value2读取数组 ${array_name[index]}实例1 [rootiZj6c3slqbp8xuu2w3i4roZ devops]# cat array_name.sh #!/usr/bin/bashmy_…...

24 KVM管理虚拟机-配置VNC-TLS登录
文章目录 24 KVM管理虚拟机-配置VNC-TLS登录24.1 概述24.2 操作步骤 24 KVM管理虚拟机-配置VNC-TLS登录 24.1 概述 VNC服务端和客户端默认采用明文方式进行数据传输,因此通信内容可能被第三方截获。为了提升安全性,openEuler支持VNC服务端配置TLS模式进…...
C++基础讲解第六期(多态、虚函数、虚析构函数、dynamic_cast、typeid纯虚函数)
C基础讲解第六期 代码中也有对应知识注释,别忘看,一起学习! 一、多态1. 问题引出2. 多态的概念和使用3. 多态的原理4. 虚析构函数5. 动态类型识别(dynamic_cast)(1) 自定义类型(2). dynamic_cast(3). typeid 6. 纯虚函数 纯虚函数需要补充 一…...

防火墙之iptables(二)
防火墙之iptables(二) 一.SNAT原理与应用 1.应用环境 局域网主机共享单个公网IP地址接入Internet(私网不能被Internet中正常路由)2.SNAT原理 修改数据包的源地址内网访问外网 将从内网发送到外网的数据包的源IP由私网IP转换成…...
亚马逊销量暴跌该如何查找原因?
很多卖家经常遇到一个棘手的问题,就是突然会遇到链接销量暴跌的问题。 比如之前链接可以稳定出单10多单的,突然连续几天只有两三单,这到底是什么原因呢? 1.查看链接的类目是否被修改 这个类目修改不一定是卖家自己修改,更多的时…...
Vue中的脚手架和路由
私人博客 许小墨のBlog —— 菜鸡博客直通车 系列文章完整版,配图更多,CSDN博文图片需要手动上传,因此文章配图较少,看不懂的可以去菜鸡博客参考一下配图! 系列文章目录 前端系列文章——传送门 后端系列文章——传送…...

Convolutional Neural network(卷积神经网络)
目录 Why CNN for Image? The whole CNN structure Convolution(卷积) Max Pooling Flatten CNN in Keras What does CNN learn? what does filter do what does neuron do what about output Deep Dream Application Pla…...

【资料分享】高边、低边晶体管开关及电路解析
高边和低边晶体管开关 电路中,晶体管常常被用来当做开关使用。晶体管用作开关时有两种不同的接线方式:高边(high side)和低边(low side)。 高边和低边是由晶体管在电路中的位置决定的。晶体管可以是双极性晶体管(BJT…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...