从“Hello,World”谈起(C++入门)

前言

c++的发展史及c++能干什么不能干什么不是我们今天的重点,不在这里展开,有兴趣的朋友可以自行查阅相关资料。今天我们主要是围绕c++的入门程序,写一个“hello,world”,并且围绕这个入门程序简单介绍一下c++和c++的一些语法,做一个简单的入门

c++是兼容c的

我们以前在学c的时候也写过c的入门程序

#include <stdio.h>int main()
{printf("Hello,World");return 0;
}

在c++中这样写是完全支持的,但c++也有一套自己的输入输出体系。我们可以先简单看一下

#include <iostream>using namespace std;int main()
{cout << "Hello,World" << endl;
}

我们知道c++出现的背景就是为了解决c中不方便的部分。我们结合这个入门程序,看一下c中有哪些弊端,c++又是如何优化的

命名空间

在C语言中,有的时候我们会遇到一种情况

#include <stdio.h>
#include <stdlib.h>int rand = 10;int main()
{printf("%d", rand);
}

当我们运行这段代码时,我们发现报错了。我们可以来看一下报错信息

通过观察不难发现是因为rand重定义导致的。不对啊,我们只定义了一个全局的rand变量,怎么会有重定义的错误呢?原来是因为 stdlib.h 这个头文件会在编译时展开,这个头文件里包含了rand()函数导致重定义的问题。显然,这个问题在C语言中比较常见,也很隐蔽,我们不可能知道我们包含的头文件里有哪些被定义过的符号和名称,为了解决这个问题c++提出了命名空间的概念。

命名空间的关键字是namespace,我们使用的时候需要在namespace后面紧跟空间的名称,在用{}包裹空间,里面可以写变量和函数,不需要跟;号

namespace zzzyh {int a;int b();
}
//其中空间名称可以任意

使用时编译器默认会在局部和全局找,如果需要在命名空间内找需要使用 :: 指定

#include <iostream>
int a = 10;
namespace zzzyh {int a=20;int b();
}
using namespace std;int main()
{cout << zzzyh::a << endl;return 0;
}

这里的输入是20,如果没有指定zzzyh::,则会在全局变量里找,输出10

namespace只能定义在全局,可以嵌套定义,嵌套定义也需要嵌套使用

c++的标准库都是在std这个命名空间中

可以在文件的多个地方定义多个同名的命名空间,最终会被整合到一起

前面应该有朋友注意到了,为啥cout,endl是std里的方法,我们没有使用std:: 的方式访问,而是直接访问?这是因为命名空间可以使用 using展开,当全局变量使用,当然也可选择展开特定的变量和函数

输入输出

c++和c一样需要包和输入输出有关的头文件,不过c++的输入输出头文件是这样包的

#include <iostream>

完整格式

#include <iostream>int main()
{int i;std::cin >> i;std::cout << i << std::endl;
}

<iostream>是InputOutputStream的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输
出对象

std::cin是istream类的对象,标准输⼊流

std::cout是ostream类的对象,标准输出流

std::endl是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区

<<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)

c++的输入输出流相比于c而言简单了不少,这得益于c++实现自动识别类型,程序员不需要再输入输出中指定类型

如果再需要高性能的需求下,可以增加一下代码提高IO效率

ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

 

缺省参数

缺省参数是c完全不支持,c++提出的概念,可以理解为在不知道具体传谁的时候为函数提供默认值。

在函数声明或者定义是,可以指定某些参数或者全部参数=某个值,如果后续在调用该函数时,对应的参数传参了则使用传入的参数,没有传参则使用默认的参数。可以分为全缺省和半缺省

规定半缺省只能从右往左连续缺省,不可跨越,这也是为了在编译时能准确确定调用的是哪个函数

传参也规定只能从左往右依次传入,不允许跨越,目的和上面一样方便编译时确定是哪个函数

如果函数的声明和定义,缺省值需要写在该函数声明处,函数定义处不写

函数重载

我们在c中,如果需要实现一个面对不同类型的加法函数往往需要起多个函数名来区分,函数重载就是为了结局这个问题的。函数重载要求函数名相同,函数的参数数量/顺序/类型不同,返回值不做要求。这样定义多个加法函数可以共用同一个函数名,但根据不同的函数参数来确定具体使用哪一个函数,降低使用成本,增加代码的可读性

引用

c中有指针的概念,就是开辟一块空间指向另一块空间,指向的空间存储被指向空间的地址,就叫指针,用指针间接操作被指向的空间

c++的引用我们认为是不开辟空间的,只是为这块空间取别名,通过别名直接操作原空间

类型& 引⽤别名 = 引⽤对象;
#include<iostream>
using namespace std;
int main()
{
int a = 0;
// 引⽤:b和c是a的别名
int& b = a;
int& c = a;
// 也可以给别名b取别名,d相当于还是a的别名
int& d = b;
++d;
// 这⾥取地址我们看到是⼀样的
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}

特性

引用必须初始化,一块空间可以有多个引用,引用不能再更改指向

使用

在使用上,我们常用在函数传参和函数返回值上,可以提高效率的同时更加方便的修改被引用对象。

引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代
 

const引用

可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访
问权限在引⽤过程中可以缩⼩,但是不能放⼤
在例如类型转换或者A*B这样的算式中,会有一个临时变量暂存结果的值,这个临时变量是具有常性的,可以理解为被const修饰

int main()
{
const int a = 10;
// 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &”
// 这⾥的引⽤是对a访问权限的放⼤
//int& ra = a;
// 这样才可以
const int& ra = a;
// 编译报错:error C3892: “ra”: 不能给常量赋值
//ra++;
// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20;
const int& rb = b;
// 编译报错:error C3892: “rb”: 不能给常量赋值
//rb++;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a = 10;
const int& ra = 30;
// 编译报错: “初始化”: ⽆法从“int”转换为“int &”
// int& rb = a * 3;
const int& rb = a*3;
double d = 12.34;
// 编译报错:“初始化”: ⽆法从“double”转换为“int &”
// int& rd = d;
const int& rd = d;
return 0;
}

 

inline

inline是一个内联函数的关键字,内联函数会在调用出展开,不建立栈帧以提高效率。但这也是建议编译器内联而已,具体内不内敛由编译器决定,内联一般需要函数体积足够小,调用足够频繁。这是为了替代c的宏函数。内联函数建议声明定义在一个文件中,否则容易造成链接错误

nullptr

在c/c++中的NULL是宏,在传统的C头⽂件(stddef.h)中,可以看到如下代码

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

c++的NULL定义为0,在实际使用中会混淆,因此引入nullprt关键字标识空指针

nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型

结语

以上便是今天的全部内容。如果有帮助到你,请给我一个免费的赞。

因为这对我很重要。

编程世界的小比特,希望与大家一起无限进步。

感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/376026.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【fastadmin 开发实战】select 级联选择

先看实现的效果 1、表单页面实现级联选择 2、级联选项后台可以编辑添加 前端代码&#xff08;编辑窗口&#xff09;&#xff1a; <div class"form-group"><label class"control-label col-xs-12 col-sm-2">{:__(渠道归属)}:</label><…

STM32HAL库+ESP8266+cJSON+微信小程序_连接华为云物联网平台

STM32HAL库ESP8266cJSON微信小程序_连接华为云物联网平台 实验使用资源&#xff1a;正点原子F407 USART1&#xff1a;PA9P、A10&#xff08;串口打印调试&#xff09; USART3&#xff1a;PB10、PB11&#xff08;WiFi模块&#xff09; DHT11&#xff1a;PG9&#xff08;采集数据…

推荐3款良心效率软件,妥妥的神器,绝对不可错过

Wise JetSearch Wise JetSearch 是一款免费且功能强大的文件搜索工具&#xff0c;支持在本地硬盘和可移动磁盘上快速查找文件和文件夹。该软件特别适用于FAT32、NTFS以及exFAT格式的硬盘。 Wise JetSearch 使用索引技术&#xff0c;可以在极短的时间内完成大规模文件的搜索任务…

Hadoop3:HDFS-通过配置黑白名单对集群进行扩缩容,并实现数据均衡(实用)

一、集群情况介绍 我的本地虚拟机&#xff0c;一共有三个节点&#xff0c;hadoop102、hadoop103、hadoop104 二、白名单 创建白名单文件whitelist&#xff0c;通过白名单的配置&#xff0c;只允许集群包含102和103两台机器可以存储数据&#xff0c;104无法存储数据。 需求 …

怎样将aac转换mp3格式?推荐四个aac转MP3的方法

怎样将aac转换mp3格式&#xff1f;当需要将aac格式音频转换为MP3格式时&#xff0c;有几种方法可以轻松实现这一目标。MP3是一种广泛支持的音频格式&#xff0c;几乎所有设备和平台都能播放MP3文件&#xff0c;包括各种音乐播放器、手机、平板电脑和汽车音响系统。而且它也提供…

【C++】入门基础(命名空间、缺省参数、函数重载)

目录 一.命名空间&#xff1a;namespace 1.namespace的价值 2.namespace的定义 3.namespace的使用方法 3.1 域解析运算符:: 3.2 using展开 3.3 using域解析运算符 二.输入输出 三.缺省参数 四.函数重载 1.参数类型不同 2.参数个数不同 3.参数顺序不同 一.命名空间&…

分析逆向案例十七——深圳大学登录逆向(新类型,有些加密参数是通过页面源代码获取的,不同于前面有发包)

网址&#xff1a;aHR0cDovL25ld2F1dGhzZXJ2ZXIuc3p1LmVkdS5jbi9hdXRoc2VydmVyL2xvZ2lu 登陆页面&#xff0c;找到登录接口&#xff0c;发现登录接口是document类型&#xff0c;而不是xhr类型&#xff0c;无法跟栈分析。 登陆两次&#xff0c;发现有两个加密参数&#xff0c;lt…

君方智能设计平台-夹点交互编辑架设计与实现

1.背景介绍 在图形平台开发中&#xff0c;实现强大的图形编辑功能对于用户体验至关重要。夹点&#xff08;Grips&#xff09;编辑是其中的一个关键部分&#xff0c;它不仅简化了用户与图形对象的交互&#xff0c;还提供了多种功能&#xff0c;从简单的移动和缩放到复杂的旋转和…

JS爬虫实战之极验四代

极验四代滑块验证码 一、目标网站说明二、流程步骤1. 逆向步骤一般分为&#xff1a;2. 接口确认1- 确认流程2- 获取verify的参数3- 构建requests验证verify的参数4- 锁定secode参数的作用 ok&#xff0c;让我们去获取verify接口中的响应&#xff01;&#xff01;&#xff01; 3…

风光摄影:相机设置和镜头选择

写在前面 博文内容为《斯科特凯尔比的风光摄影手册》读书笔记整理涉及在风景拍摄中一些相机设置&#xff0c;镜头选择的建议对小白来讲很实用&#xff0c;避免拍摄一些过曝或者过暗的风景照片理解不足小伙伴帮忙指正 &#x1f603;,生活加油 99%的焦虑都来自于虚度时间和没有好…

240712_昇思学习打卡-Day24-LSTM+CRF序列标注(3)

240712_昇思学习打卡-Day24-LSTMCRF序列标注&#xff08;3&#xff09; 今天做LSTMCRF序列标注第三部分&#xff0c;同样&#xff0c;仅作简单记录及注释&#xff0c;最近确实太忙了。 Viterbi算法 在完成前向训练部分后&#xff0c;需要实现解码部分。这里我们选择适合求解…

【Linux】进程间通信——消息队列和信号量

目录 消息队列&#xff08;message queue&#xff09; 信号量&#xff08;Semaphore&#xff09; system V版本的进程间通信方式有三种&#xff1a;共享内存&#xff0c;消息队列和信号量。之前我们已经说了共享内存&#xff0c;那么我们来看一下消息队列和信号量以及它们之间…

Docker容器的生命周期

引言 Docker 容器作为一种轻量级虚拟化技术&#xff0c;在现代应用开发和部署中扮演着重要角色。理解容器的生命周期对于有效地管理和运维容器化应用至关重要。本文将深入探讨 Docker 容器的生命周期&#xff0c;从创建到销毁的各个阶段&#xff0c;帮助读者更好地掌握容器管理…

Unity最新第三方开源插件《Stateful Component》管理中大型项目MonoBehaviour各种序列化字段 ,的高级解决方案

上文提到了UIState, ObjectRefactor等,还提到了远古的NGUI, KBEngine-UI等 这个算是比较新的解决方法吧,但是抽象出来,问题还是这些个问题 所以你就说做游戏是不是先要解决这些问题? 而不是高大上的UiImage,DoozyUI等 Mono管理引用基本用法 ① 添加Stateful Component …

【正点原子i.MX93开发板试用连载体验】录音小程序采集语料

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【正点原子i.MX93开发板试用连载体验】基于深度学习的语音本地控制 - 正点原子学习小组 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) 接下来就是要尝试训练中文提示词。首先要进行语料采集&#xff0c;这是一…

【2-1:RPC设计】

RPC 1. 基础1.1 定义&特点1.2 具体实现框架1.3 应用场景2. RPC的关键技术点&一次调用rpc流程2.1 RPC流程流程两个网络模块如何连接的呢?其它特性RPC优势2.2 序列化技术序列化方式PRC如何选择序列化框架考虑因素2.3 应用层的通信协议-http2.3.1 基础概念大多数RPC大多自…

STM32Cubemx配置生成 Keil AC6支持代码

文章目录 一、前言二、AC 6配置2.1 ARM ComPiler 选择AC62.2 AC6 UTF-8的编译命令会报错 三、STM32Cubemx 配置3.1 找到stm32cubemx的模板位置3.2 替换文件内核文件3.3 修改 cmsis_os.c文件3.4 修改本地 四、编译对比 一、前言 使用keil ARM compiler V5的时候&#xff0c;编译…

M J更改图像生成方式的参数选项

一个完整的/imagine命令可能包含几个内容,例如图像 URL、图像权重、算法版本和其他开关。 /imagine参数应遵循以下顺序: /imagine prompt: https://example/tulip.jpg a field of tulips in the style of Mary Blair --no farms --iw .5 --ar 3:2 在这种情况下,“开关”是指…

如何压缩pdf文件大小,怎么压缩pdf文件大小

在数字化时代&#xff0c;pdf文件因其稳定的格式和跨平台兼容性&#xff0c;成为了工作与学习中不可或缺的一部分。然而&#xff0c;随着pdf文件内容的丰富&#xff0c;pdf文件的体积也随之增大&#xff0c;给传输和存储带来了不少挑战。本文将深入探讨如何高效压缩pdf文件大小…

【保姆级教程】CenterNet的目标检测、3D检测、关键点检测使用教程

一、代码下载 仓库地址:https://github.com/xingyizhou/CenterNet?tab=readme-ov-file 二、目标检测 2.1 下载预训练权重 下载预训练权重ctdet_coco_dla_2x.pth放到models文件夹下 下载链接:https://drive.google.com/file/d/18Q3fzzAsha_3Qid6mn4jcIFPeOGUaj1d/edit …