C++入门讲解第一篇

news2024/12/24 8:28:41

在这里插入图片描述

大家好,我是Dark Fire,终于进入了C++的学习,我知道面对我的将是什么,就算变成秃头佬,也要把C++学好,今天是C++入门第一篇,我会尽全力将知识以清晰易懂的方式表达出,希望我们一起加油!

文章目录

    • 一,C++中的关键字
      • C++输入与输出
      • 命名空间
        • 命名空间的定义
        • 使用命名空间
      • auto关键字

一,C++中的关键字

 首先,和C语言不同的是,C++又增加了一些关键字,相对于C语言32个关键字,C++63个关键字象征着C++语言会更加灵活多变。由于C++是本贾尼博士在C语言的基础上改进而来,所以C++的关键字大部分还是C语言里的。
红色为C语言已经存在的,黑色为C++扩展的。
在这里插入图片描述
 由于这里关键字太多,用例讲解反而记忆不会深刻,所以在之后的章节里会结合一些例子帮助大家来理解和掌握这些关键字的使用场景和注意事项。

C++输入与输出

 在C语言中,我们常常用printf和scanf进行读和写的功能,在C++中更换了输入和输出的方法,在C语言中只能对特定种类的数据进行输入和输出功能,而在C++中可以实现类变量的输入和输出(具体会在后边进行讲解)。

在C++中,包含头文件以及ing名空间的使用方法std。iostream就是i,o流的意思,数据从哪里流向哪里。cout和cin是在命名空间中所定义的,所以在使用时要打开命名空间(下边会讲到)。

 使用cout(标准输出对象(控制台))和cin(默认输入对象(键盘))进行输入和输出。
cout用例如下
在这里插入图片描述
 这里<<是流插入运算符,至于>>是流提取运算符,endl是打印后换行的意思,和C语言中的\n作用相同。
这段代码的意思是将i变量的值流入标准输出对象即控制台。
cin用例如下
在这里插入图片描述
默认a的值为0,输入4后将a的值更改为4。
 你一定会有疑问,那么这些变量是如何被识别他们是什么类型的呢?

  • 实际上C++的输入和输出可以自动识别变量类型。(交给编译器,让他自己识别)

用例如下
在这里插入图片描述
是不是超级方便。
在后边的学习中你才会意识到什么是真正的方便。

 关于cout和cin还有很多复杂的用法,比如控制浮点数输出精度,控制整形输出格式等,后续如果需要用到我们在进行讲解,而且C++是兼容C语言的,这些问题也可以由C语言的转义字符进行操作,就不展开讨论。

命名空间

当我们在用C语言进行编程时,常常会出现这样的问题。

#include <time.h>
int time = 0;
int main()
{
	
	printf("%d ", time);
	return 0;
}

当我们包含了头文件time.h时,创建全局变量time,打印time发现报错如下。
在这里插入图片描述
和头文件中的同名变量产生冲突,我们就不得不改变我们创建的变量名。

 这种情况经常发生,而且我们命名过一个变量一个名字之后,在该作用域中这个变量名就不能再重复使用了,而且在后边函数,变量,以及创造出来的类是大量存在的,如果将这些变量都存于全局作用域中,势必会出现很多错误,如何避免呢?

namespace关键字就是针对这一问题存在的。
使用命名空间可以对标识符的名称进行本地化,以避免命名冲突或名字污染。

命名空间的定义

 关键字namespace后边跟命名空间的名字,然后接一对大括号即可,{}内部便是命名空间中的成员。
用例如下

namespace Dark
{
	int time = 0;
	int Add(int x, int y)
	{
		return x + y;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}

命名空间中不仅可以有变量还可以有函数,自定义类型等。
当然,命名空间还可以嵌套

namespace Dark
{
	int time = 0;
	int Add(int x, int y)
	{
		return x + y;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
	namespace Fire
	{
		int rand = 0;
		int Sub(int x, int y)
		{
			return x - y;
		}
	}
}

一个命名空间就限制了一个新的作用域,命名空间内的所有内容都局限于此命名空间内。

使用命名空间

命名空间内部元素使用有以下三种方法:
1,命名空间及其作用域限定符

int main()
{
	cout << Dark::time << endl;
	return 0;
}

2,使用using将命名空间中的某个元素引入

int main()
{
	using Dark::time;
	cout << time << endl;
	return 0;
}

3,使用using space 加命名空间名称将命名空间引入就像前边所说std命名空间的引入一样。

int main()
{
	using namespace Dark;
	cout << Fire::rand << endl;

	return 0;
}

引入后就可以直接访问内部的命名空间啦。
访问嵌套的命名空间可以用上边的方法深度挖掘。
在这里插入图片描述
就像这样

int main()
{
	cout << Dark::Fire::rand << endl;

	return 0;
}

是不是已经十分了解啦。

auto关键字

 在C++中,随着程序越来越复杂,程序中用到的类型也越来越复杂,一层一层的嵌套,让类型难于拼写,含义不明确就容易拼写错误。auto就是来解决这一问题的。
比如这个例子(举例说明,细节后边会讲)

#include <string>
#include <map>
int main()
{
	std::map<std::string, std::string>m{ {"aaa","aaaa"},{"bbb","bbbb"},{"ccc","cccc"} };
	std::map<std::string, std::string>::iterator it = m.begin();

	return 0;
}

有些数据类型很长,很多聪明的友友会考虑用typedef取别名。

#include <string>
#include <map>
typedef std::map<std::string, std::string> Map;
int main()
{
	Map m{ {"aaa","aaaa"},{"bbb","bbbb"},{"ccc","cccc"} };
	Map::iterator it = m.begin();

	return 0;
}

然而在某些情况下,typedef不能解决这些问题。
例如
在这里插入图片描述

 在C++11中,标准委员会赋予了auto全新的含义,auto不再是一个存储类型指示符,而是作为一个新的类型来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

auto可以自动推导数据的类型。
在这里插入图片描述
typeid函数可以知道变量的类型。
注意:
使用auto定义变量时,必须要将其初始化,在编译阶段编译器需要根据其初始化表达式来推导auto的实际类型,因此auto并非是一种类型的声明,而是类型的占位符,编译器在编译期间会将auto替换为变量实际的类型。
 可以发现,我们将数据类型的确定让编译器确认了,而不是主动传递%d %f之类的标识符。
auto的使用
1,auto与指针和引用结合起来使用
 用auto声明指针类型时,用auto和auto没有任何区别,加上后,auto推导的就是指针类型,不加时,推导的就是指针类型加 *。
但是,用auto声明引用时,必须加上&,不然编译器也不知道你是不是引用。
用例如下
在这里插入图片描述
2,在同一行定义多个变量
 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器会报错,因为编译器只会对第一个类型进行推导,然后用推导出的类型定义这行后边的类型。
在这里插入图片描述
auto这么厉害,但也有不可推到的场景
1,auto不能作为函数的参数
在这里插入图片描述
auto不能推导出形参的实际类型,有可能会造成二义性,所以编译失败。
2,auto不能直接声明数组
在这里插入图片描述
auto常见的用法
最常见的优势用法就是新式for循环,还有lambda表达式进行配合使用(后边会讲)
范围for的用法
在C++98如果想遍历一个数组

void TestFor()
{
	int array[] = { 1,2,3,4,5 };
	for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
	{
		array[i] *= 2;
	}
	for (int*p=array; p <array+ sizeof(array) / sizeof(array[0]); p++)
	{
		cout << *p << endl;
	}
}

遍历数组各个元素都乘以2,然后借助下标进行打印。
 在C++11中,对于一个有范围的集合,对程序员来说,循环的范围是多余的,这件事我们也可以甩给编译器。

for循环后的括号由“:”分为两部分,第一部分是范围内用于迭代的变量,第二部分则是被迭代的范围。

用例如下

void TestFor()
{
	int array[] = { 1,2,3,4,5 };
	for (auto& e : array)
	{
		e *= 2;
	}
	for (auto e : array)
	{
		cout << e << " " << endl;
	}
}

 在这里e是被引用的array里的每个元素,auto可以自动识别变量的类型,与普通循环类型,这里也可以用continue结束某次循环,也可以使用break跳出循环。

 for循环迭代的范围必须是确定的,对于数组而言,就是第一个元素到最后一个元素的范围。
在这里插入图片描述
今天就介绍到这里啦,如果有问题欢迎友友们指出哦。

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

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

相关文章

电脑出现emp.dll文件缺失的错误提示怎么办,教你一键解决dll丢失问题

今天&#xff0c;我想和大家分享一下关于emp.dll文件丢失的4个解决方法&#xff0c;希望能对大家有所帮助。 首先&#xff0c;我们要明确emp.dll文件的作用。emp.dll是一个动态链接库文件&#xff0c;这个文件对于许多程序的正常运行至关重要&#xff0c;一旦丢失&#xff0c;…

在树莓派上使用Nginx搭建本地站点并通过内网穿透实现远程访问

目录 前言 1. Nginx安装 2. 安装cpolar 3.配置域名访问Nginx 4. 固定域名访问 5. 配置静态站点 前言 安装 Nginx&#xff08;发音为“engine-x”&#xff09;可以将您的树莓派变成一个强大的 Web 服务器&#xff0c;可以用于托管网站或 Web 应用程序。相比其他 Web 服务…

代码随想录算法训练营第23期day41|01背包问题、01背包问题——滚动数组、416. 分割等和子集

目录 一、01背包理论基础 1.二维dp数组01背包 1&#xff09;确定dp数组以及下标的含义 2&#xff09;确定递推公式 3&#xff09;dp数组如何初始化 4&#xff09;确定遍历顺序 5&#xff09;举例推导dp数组 2.一维dp数组&#xff08;滚动数组&#xff09; 1&#xf…

CSS必学:元素之间的空白与行内块的幽灵空白问题

作者:WangMin 格言:努力做好自己喜欢的每一件事 CSDN原创文章 博客地址 &#x1f449; WangMin 我们在开发的过程中&#xff0c;难免会出现一些难以预料的问题。那么其中&#xff0c;CSS空白现象就是非常常见的问题之一。虽然它已经被发现很久&#xff0c;但仍然有许多新手和经…

Redis中的List类型

目录 List类型的命令 lpush lpushx rpush lrange lpop rpop lindex linsert llen lrem ltrim lset 阻塞命令 阻塞命令的使用场景 1.针对一个非空的列表进行操作 2.针对一个空的列表进行操作 3.针对多个key进行操作. 内部编码 lisi类型的应用场景 存储(班级…

智慧工厂人员定位系统及uwb定位技术在现代工厂安全管理中的应用【uwb定位系统源码】

uwb定位系统源码 智慧工厂人员定位系统源码 定位系统源码 随着经济的高速发展&#xff0c;现代制造业规模不断扩大&#xff0c;生产车间面积广阔&#xff0c;生产设备日益繁多&#xff0c;生产工人数量多且分散作业&#xff0c;难以进行有效管理和实施全方位风险管控。现代工厂…

C++查漏补缺与新标准(C++20,C++17,C++11)01 C++快速回顾(一)

本内容参考C20高级编程 模块导入 C 20提供了对于模块的支持&#xff0c;用来代替之前的头文件机制 //Helloworld.cpp import <iostream>int main(){std::cout<<"Hello World!"<<std::end;return 0; }如果在你的编译器中尚未支持模块&#xff0c…

大数据之陌陌聊天数据分析案例

目录 目标需求 数据内容 基于Hive数仓实现需求开发 1.建库建表、加载数据 2.ETL数据清洗 3需求指标统计 目标需求 基于Hadoop和hive实现聊天数据统计分析&#xff0c;构建聊天数据分析报表 1.统计今日总消息量 2.统计今日每小时消息量&#xff0c;发送和接收用户数 3.…

分隔节点(C++解法)

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输…

JavaScript 自定义对象

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-定义对象</title> </head><body&g…

leetCode 322.零钱兑换 完全背包 + 动态规划 + 记忆化搜索 + 递推 + 空间优化 + 画递归树

关于此题我的往期文章&#xff1a;LeetCode 322.零钱兑换 完全背包 动态规划_呵呵哒(&#xffe3;▽&#xffe3;)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133386579看本期文章时&#xff0c;可以先回顾一下动态规划入门知识和完全背包理论和实战…

MES 与ERP 什么时候能上

中小制造企业数字化转型升级近几年被炒得如火如荼&#xff0c;各种政策的支持、补贴和会议活动的举办&#xff0c;都在给中小制造企业管理者洗脑&#xff0c;一定要数字化升级&#xff0c;否则就被市场淘汰。 中小制造企业其实是弱势群体&#xff0c;向上需要维护好客户&#…

每天五分钟计算机视觉:搭建手写字体识别的卷积神经网络

本文重点 我们学习了卷积神经网络中的卷积层和池化层,这二者都是卷积神经网络中不可缺少的元素,本例中我们将搭建一个卷积神经网络完成手写字体识别。 卷积和池化的直观体现 手写字体识别 手写字体的图片大小是32*32*3的,它是一张 RGB 模式的图片,现在我们想识别它是从 …

JVM虚拟机:垃圾回收器组合参数设定

本文重点 前面的课程中我们介绍了目前JVM中主流的垃圾回收器&#xff0c;不同的回收器会有不同的组合&#xff0c;其中1.8版本的jdk中&#xff0c;默认使用的是Parallel ScavengeParallel Old&#xff0c;也就是说新生代使用Parallel Scavenge&#xff0c;然后老年代使用Paral…

7-3 有趣的最近公共祖先问题 分数 15

#include<iostream> using namespace std;int n 0, m 0; int FindAncestor(int* post, int* in, int a, int b, int size) {int root post[size - 1];if (root a || root b)return root;//中序遍历根的下标int rooti;for (rooti 0; rooti < size; rooti){if (ro…

【Java 进阶篇】Java文件下载案例详解

文件下载是Web应用程序中常见的功能之一。它允许用户从Web服务器上下载文件&#xff0c;例如文档、图片、音频、视频等。在本文中&#xff0c;我们将详细解释如何在Java Web应用程序中实现文件下载功能。我们将提供示例代码和逐步说明&#xff0c;以帮助您理解和实现这一功能。…

C语言编译过程总结

开发C程序有四个步骤&#xff1a;预处理、编译、汇编和链接。任何一个体系结构处理器上都可以使用C语言程序&#xff0c;只要该体系结构处理器有相应的C语言编译器和库&#xff0c;那么C源代码就可以编译并连接到目标二进制文件上运行。 我们创建一个test.c为例来讲解程序编译的…

一次下载的小说txt章节优化记录

缘由&#xff1a; 在线阅读小说有时候因为网络等因素&#xff0c;造成章节不能及时刷新出来&#xff0c;因此经过一番百度&#xff0c;把小说章节下载了下来&#xff0c;但是 章节是错乱的&#xff0c;且参杂很多网站水印&#xff0c;阅读起来挺难受的&#xff0c;因此 优化一…

7-4 修理牧场 分数 15

#include<iostream> #include<queue> using namespace std; #define maxn 10005int main() {int n 0, data 0;cin >> n;//建小堆: //上调建堆中用greater: 父大子小 父子交换 小的上去 大的下去 priority_queue<int, vector<int>, greater<int…