从“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.mzph.cn/diannao/45876.shtml

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

相关文章

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下&#xff1a; 科学计算模式效果如下&#xff1a; 更具体的功能演示视频见如下链接…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 ​编辑 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了&#xff0c;上次发文的时候是好几个月之前了&#xff0c;现在我是想去…

论文分享|NeurIPS2022‘华盛顿大学|俄罗斯套娃表示学习(OpenAI使用的文本表示学习技术)

论文题目&#xff1a;Matryoshka Representation Learning 来源&#xff1a;NeurIPS2022/华盛顿大学谷歌 方向&#xff1a;表示学习 开源地址&#xff1a;https://github.com/RAIVNLab/MRL 摘要 学习表征对于现代机器学习很重要&#xff0c;广泛用于很多下游任务。大多数情…

java配置nginx网络安全,防止国外ip访问,自动添加黑名单,需手动重新加载nginx

通过访问日志自动添加国外ip黑名单 创建一个类&#xff0c;自己添加一个main启动类即可测试 import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONArray; import org.json.JSONObject; import org.sp…

面试经验之谈

优质博文&#xff1a;IT-BLOG-CN ​通常面试官会把每一轮面试分为三个环节&#xff1a;① 行为面试 ② 技术面试 ③ 应聘者提问 行为面试环节 面试开始的5~10分钟通常是行为面试的时间&#xff0c;面试官会参照简历和你的自我介绍了解应聘者的过往经验和项目经历。由于面试官…

nodejs模板引擎(一)

在 Node.js 中使用模板引擎可以让您更轻松地生成动态 HTML 页面&#xff0c;通过将静态模板与动态数据结合&#xff0c;您可以创建可维护且易于扩展的 Web 应用程序。以下是一个使用 Express 框架和 EJS 模板引擎的基本示例&#xff1a; 安装必要的依赖&#xff1a; 首先&#…

分享浏览器被hao123网页劫持,去除劫持的方式

昨天看python相关的自动化工作代码时&#xff0c;发现谷歌浏览器被hao123劫持了&#xff0c;把那些程序删了也不管用 方法1&#xff1a;删除hao123注册表&#xff0c;这个方式不太好用&#xff0c;会找不到注册表 方法2&#xff1a;看浏览器快捷方式的属性页面&#xff0c;一…

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

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

APP专项测试之网络测试

背景 当前app网络环境比较复杂&#xff0c;越来越多的公共wifi&#xff0c;网络制式有2G、3G、4G网络&#xff0c;会对用户使用app造成一定影响&#xff1b;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使得弱网测试显得尤为重要&#xff1b; 网络正…

链路追踪系列-02.演示zipkin

当本机启动docker es zipkinServer之后&#xff1a; 启动3个项目&#xff1a;先eureka-server&#xff0c;再 PaymentMain8001,… 浏览器打开&#xff1a;http://localhost:9001/consumer/payment/zipkin consumer代码 &#xff1a; provider: 此时查询es:

3-2 多层感知机的从零开始实现

import torch from torch import nn from d2l import torch as d2lbatch_size 256 # 批量大小为256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # load进来训练集和测试集初始化模型参数 回想一下&#xff0c;Fashion-MNIST中的每个图像由 28 28 784…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…

[CISCN2018]2ex

啊!好恶心的mips寄存器 好多IDA都查不到,这寄存器~! fuck! 但是这种寄存器一般的题都不难 这道题就是 我用平常的方法,没找到 左边函数一个一个点 看见这里0X3F base64 密文呢? 我giao 外面的txt文件里面 脚本 import base64 import string# 定义你的自定义字符集 st…

聊点基础---Java和.NET开发技术异同全方位分析

1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界&#xff01;对于刚从Java转过来的开发者来说&#xff0c;你会发现C#和Java有很多相似之处&#xff0c;但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法&#xff0c;并比较一下与Java的异同。 程序结构 C#程序…

美团收银Android一面凉经(2024)

美团收银Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《美团收银Android一面凉经(2024)》。 应聘岗位: 美团餐饮PaaS平台Android开发工程师…

【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大多自…

【C++ | 虚函数】虚函数详解 及 例子代码演示(包含虚函数使用、动态绑定、虚函数表、虚表指针)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Matlab-Simulink模型保存为图片的方法

有好多种办法将模型保存为图片&#xff0c;这里直接说经常用的 而且贴到Word文档中清晰、操作简单。 simulink自带有截图功能&#xff0c;这两种方法都可以保存模型图片。选择后直接就复制到截切板上了。直接去文档中粘贴就完事了。 这两个格式效果不太一样&#xff0c;第一种清…

JS登录页源码 —— 可一键复制抱走

前期回顾 https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501https://blog.csdn.net/m0_57904695/article/details/139838176?spm1001.2014.3001.5501 登录页预览效果 <!DOCTYPE html> <html lang"en"><head…

通信协议 | 一文玩转UART协议就够了

文章目录 协议基础1、UART简介2、UART特性3、UART协议帧3.1、起始位3.2、数据位3.3、奇偶校验位3.4、停止位 4、UART通信步骤 最详细的UART通讯协议分析Verilog代码实现UART接口模块驱动 协议基础 1、UART简介 UART&#xff08;Universal Asynchronous Receiver/Transmitter&…