从“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.mfbz.cn/a/797211.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows USB 设备驱动开发-USB 功能控制器驱动开发(二)

USB 功能客户端驱动程序使用的 UFX 对象和句柄 USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 重要的 API UfxDeviceCreateUfxEndpointCreate USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 这些对象是 WDF 对…

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架&#xff0c;支持所有主要操作系统&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写&#xff0c;包括计算机视觉、几何、媒体处理、网络和渲染&#x…

sentinel源码分析: dashboard与微服务的交互、pull模式持久化

文章目录 原始方式微服务端规则如何保存规则如何加载进内存微服务端接收控制台请求控制台推送规则总结 pull拉模式官方demo如何整合Spring Cloud整合Spring Cloud 前置知识 SentinelResource的实现原理、SphU.entry()方法中ProcessorSlotChain链、entry.exit() 建议先会使用se…

鸿蒙系统在服装RFID管理中的应用:打造智能零售新时代

​随着物联网技术的迅速发展&#xff0c;服装零售行业正面临着新的变革与挑战。鸿蒙系统作为新一代智能操作系统&#xff0c;结合RFID技术&#xff0c;为服装行业提供了高效、智能的管理解决方案。常达智能物联&#xff0c;作为RFID技术的领先企业&#xff0c;致力于将鸿蒙系统…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)

7-1、2、3 IPFS介绍使用及浏览器交互&#xff08;react区块链实战&#xff09; 7-1 ipfs介绍7-2 IPFS-desktop使用7-3 reactipfs-api浏览器和ipfs交互 7-1 ipfs介绍 IPFS区块链上的文件系统 https://ipfs.io/ 这个网站本身是需要科学上网的 Ipfs是点对点的分布式系统 无限…

如何在 Android Studio 中导出并在 IntelliJ IDEA 中查看应用的 SQLite 数据库

在 Android 应用开发过程中&#xff0c;调试和查看应用内的数据库内容是常见的需求。本文将介绍如何使用 Android Studio 导出应用的 SQLite 数据库&#xff0c;并在 IntelliJ IDEA 中查看该数据库。 步骤一&#xff1a;在设备上运行您的应用 首先&#xff0c;确保您的应用已…

5G-A通感融合赋能低空经济-RedCap芯片在无人机中的应用

1. 引言 随着低空经济的迅速崛起&#xff0c;无人机在物流、巡检、农业等多个领域的应用日益广泛。低空飞行器的高效、安全通信成为制约低空经济发展的关键技术瓶颈。5G-A通感一体化技术通过整合通信与感知功能&#xff0c;为低空网络提供了强大的技术支持。本文探讨了5G-A通感…

未来互联网的新篇章:深度解析Facebook的技术与战略

随着科技的飞速发展和社会的不断变迁&#xff0c;互联网作为全球信息交流的重要平台&#xff0c;正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅是人们沟通、分享和互动的重要场所&#xff0c;更是科技创新和数字化进程的推动者。本文…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城狮&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…

数据结构——考研笔记(二)线性表的定义和线性表之顺序表

文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…

如何在Linux上如何配置虚拟主机

在Linux上配置虚拟主机可以通过使用Apache HTTP服务器来实现。Apache是一个开源的跨平台的Web服务器软件&#xff0c;可以在多种操作系统上运行并支持虚拟主机的配置。 以下是在Linux上配置虚拟主机的步骤&#xff1a; 安装Apache HTTP服务器 在终端中运行以下命令来安装Apache…

通过vm可以访问那些属性——06

1.通过vue实例都可以访问那些属性&#xff1f;&#xff08;通过vm都可以vm.什么&#xff09; vue实例中的属性很多。有的以$开始&#xff0c;有的以_开始。 所有以$开始的属性&#xff0c;可以看做是公开的属性&#xff0c;这些属性是提供给程序员使用的 所有以_开始的属性&…

Linux的世界 -- 初次接触和一些常见的基本指令

一、Linux的介绍和准备 1、简单介绍下Linux的发展史 1991年10月5日&#xff0c;赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组(comp.os.minix&#xff09;中宣布他编制出了一种类似UNIX的小操作系统&#xff0c;叫Linux。新的操作系统是受到另一个UNIX的…

系统架构设计师教程(清华第2版)<第2章 计算机系统基础知识>解读

系统架构设计师教程 第二章 计算机系统基础知识-2.1计算机系统概述 2.2 计算机硬件 2.1 计算机系统概述2.2 计算机硬件2.2.1 计算机硬件组成2.2.2 处理器2.2.2.1 控制单元(CU)2.2.2.2 算术逻辑单元(ALU)2.2.2.3 指令集2.2.2.3.1 CISC的特点2.2.2.3.2 RISC的特点2.2.3 存储器2.2…

Lottery 分布式抽奖(个人向记录总结)

1.搭建&#xff08;DDDRPC&#xff09;架构 DDD——微服务架构&#xff08;微服务是对系统拆分的方式&#xff09; &#xff08;Domain-Driven Design 领域驱动设计&#xff09; DDD与MVC同属微服务架构 是由Eric Evans最先提出&#xff0c;目的是对软件所涉及到的领域进行建…

html(抽奖设计)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>抽奖</title><style type"text/css">* {margin: 0;padding: 0;}.container {width: 800px;height: 800px;border: 1px dashed red;position: absolut…

【学术会议征稿】第三届智能电网与能源系统国际学术会议

第三届智能电网与能源系统国际学术会议 2024 3rd International Conference on Smart Grid and Energy Systems 第三届智能电网与能源系统国际学术会议&#xff08;SGES 2024&#xff09;将于2024年10月25日-27日在郑州召开。 智能电网可以优化能源布局&#xff0c;让现有能源…

C++之多态使用小结

1、多态定义 1.1 多态概念 C多态性&#xff08;Polymorphism&#xff09;是面向对象编程(OOP)的一个重要特性之一&#xff0c;它允许我们使用统一的接口来处理不同类型的对象。多态性使得程序更加灵活、可扩展并且易于维护。 通俗来说&#xff0c;就是多种形态&#xff0…

Java小白入门到实战应用教程-开发环境搭建-IDEA2024安装激huo详细教程

writer:eleven 安装IDEA2024 一、下载IDEA 推荐大家去官网下载 我这里也给大家直接准备了安装包&#xff0c;和激huo教程&#xff0c;大家可以自行下载使用。 注意&#xff1a;激huo教程只用于学习交流&#xff0c;不可商用。 IDEA2024安装包及激huo教程 说明&#xff1a…