C++入门基础

前言

本篇博客讲解一下c++得入门基础

💓 个人主页:普通young man-CSDN博客

⏩ 文章专栏:C++_普通young man的博客-CSDN博客

⏩ 本人giee:普通小青年 (pu-tong-young-man) - Gitee.com

      若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

C++发展历史

起源与初期阶段(1979-1985)

标准化与C++98(1990s)

技术进步与C++11(2011年)

进一步的现代化(C++14至C++20)

当前与未来

c++版本

c++基础

命名空间

定义

::操作符被称为作用域解析操作符

命名空间的嵌套定义:

多文件在一个命名空间

命名空间的展开

C++的输入输出

输入输出流(I/O Stream)

缺省函数

定义

代码举例

重载函数

引用

引用的概念和意义

引用的特性

引用的使用


C++发展历史

        C++是一种强大的多范式编程语言,它的历史可以追溯到1979年,由丹麦计算机科学家Bjarne Stroustrup在贝尔实验室开始研发。以下是C++发展的主要里程碑:

起源与初期阶段(1979-1985)

  • 1979年:Bjarne Stroustrup开始基于C语言开发一种新的语言,最初称为“C with Classes”,目的是结合C语言的高效性和面向对象编程的特性。

  • 1983年:语言正式更名为C++,名称由Rick Mascitti建议,灵感来源于C语言中的“++”运算符,象征着对C语言的增强。此时,C++已经成为一种独立的语言,不仅仅只是C语言的简单扩展。

  • 1985年:首个正式版本的C++发布,包含了一些基本的面向对象特性,如类和继承。

标准化与C++98(1990s)

  • 1998年:C++的第一个国际标准ISO/IEC 14882:1998发布,通常被称为C++98。这个标准引入了模板、命名空间、异常处理等特性,极大地增强了语言的功能。

技术进步与C++11(2011年)

  • 2011年:C++11标准发布,这是一个重要的里程碑,引入了诸如智能指针、lambda表达式、自动类型推导、范围for循环和并发编程支持等现代特性,显著提高了C++的易用性和安全性。

进一步的现代化(C++14至C++20)

  • 2014年:C++14标准发布,它对C++11进行了细化和补充,提供了更多的便利性和语言一致性。

  • 2017年:C++17标准发布,引入了变量模板、文件系统库、并行算法等功能,继续推动C++向现代化方向发展。

  • 2020年:C++20标准发布,它包含了概念(Concepts)、模块(Modules)、更大的类型安全性和更多实用工具,使C++更加现代化和易于使用。

  • 当前与未来

  • C++20之后,C++23标准预计在2023年发布,继续增强语言特性和库,包括改进的概念支持、更好的错误处理机制、以及对模块系统的持续改进。

C++老登:Bjarne Stroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不 同的地⽅可能有差异)在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作

这老登长这样:


c++版本

c++的相关参考文档

cplusplus.com - C++资源网络  

cppreference.com   //官方文档

C++ 参考手册 - cppreference.com  //官方文档汉化

c++基础

c++的第一个程序:

#include<iostream>//标准IO(输入/输出)流

using namespace std;//标准命名空间

int main() {
	cout << "Hello C Plus Plus" << endl;
    return 0;
}

ok现在我们已经掌握了c++的输出了

命名空间

        在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。

举一个C语言的例子来对比

#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main() {

	printf("%d\n",rand);
	return 0;
}

为什么会报rand重定义的错误?

这个是#include<stdlib.h>中的,就是因为有名字重复,所以有时候你做项目的突然需要一个头文件的时候,突然报了个重定义错误,或许你会说我不定义全局变量就行了,但是这是避免不了的,你可以去看一下我的项目专栏

这种问题后来就被我们的c++老登给优化了,于是就出现了namespace(命名空间),那我用命名空间写一下:

#include<iostream>
#include<stdlib.h>
namespace YM{
	int rand = 10;
}

int main() {
	printf("%d\n", YM::rand);

}

可以看到我这里自己定义了一个命名空间,为什么这里就不会有影响了嘞?

定义

命名空间的声明语法非常简单,通常形式如下:

namespace 命名 {
    // 命名空间内的定义
}

除了函数局部域、全局域、命名空间域和类域之外,C++中还有文件作用域、命名空间作用域、类作用域等,它们共同构成了C++的命名系统。每个域不仅影响着编译器如何解析标识符,还可能影响到变量的生命周期和可见性,但需要注意的是,命名空间域和类域本身并不改变其内部变量的生命周期。

这里提到的域,我相信大家应该都懂,作用域不一样,所以就不会一样,YM::rand 就是访问YM这个命名空间域里面的rand

::操作符被称为作用域解析操作符

全局作用域解析:当你在一个局部作用域(如函数体内)中想要明确引用全局作用域的某个标识符(如全局变量、函数等)时,你可以使用::来指明你要访问的是全局作用域中的那个标识符,而不是当前局部作用域中可能存在的同名标识符。例如:

#include<iostream>

using namespace std;
int x = 20;
int main() {
	int x = 10;
	cout << ::x << endl;
	return 0;
}

这里加了域操作符,但是前面啥也不加,就是访问的全局域

命名空间的嵌套定义:

#include<iostream>

namespace YM {
	int x = 10;
	namespace xy {
		
		int x = 20;
	}

}
namespace tmp {
	namespace x {
		int rand = 20;
		int sum(int x, int y) {
			return x + y;
		}
	}
	namespace y {
		int rand = 30;
		int sum(int x, int y) {
			return x * y;
		}
	}
}
using namespace std;
int main() {
	
	cout << YM::x << endl;
	cout << YM::xy::x << endl;

	cout << tmp::x::rand << endl;
	cout << tmp::y::rand << endl;

	cout << tmp::x::sum(3, 2) << endl;
	cout << tmp::y::sum(3, 2) << endl;

	return 0;
}

大家可以把这个代码拷贝过去自己感受一下

多文件在一个命名空间

我们可以看到这里我将栈和队列都放在一个命名空间里面

从这里你是不是有一种封装数据结构的感觉,这里就可以证明我们如果在公司里面将我们写的程序弄到一个namespace1空间中然后上传到一个namespace2里,然后我的同事用同样的方法也可以进行上传到namespace2,因为域之间互不干扰,这样就会非常爽!!!

命名空间的展开

这个是标准命名空间的展开

我们也可以自己定义

不展开

展开

你可以看出来它展开和不展开的区别:

  • 可读性和清晰度:不展开命名空间意味着你需要显式地指定元素的来源,这可以增加代码的可读性和清晰度,尤其是在多个命名空间中使用相同名称的情况下。

  • 避免命名冲突:展开命名空间可能导致与现有命名冲突,特别是与标准库中的命名冲突。例如,std命名空间包含了C++标准库的大部分功能,如果使用using namespace std;,你可能会意外地覆盖其他命名空间中的同名元素。

  • 代码维护:不展开命名空间可以使代码更易于维护,因为你总是知道一个特定标识符的确切来源。

  • 性能:虽然在现代编译器中性能差异可能微乎其微,但在理论上,使用作用域解析操作符可能会稍微增加编译时间,因为它需要更多的解析步骤。

C++的输入输出

输入输出流(I/O Stream)

  • 概述<iostream> 是标准的输入输出流库,定义了标准的输入、输出对象,简化了数据的输入输出处理。

  • std::cinistream 类的对象,主要面向窄字符(类型为 char)的标准输入流,用于从标准输入设备(如键盘)读取数据。

  • std::coutostream 类的对象,主要面向窄字符的标准输出流,用于向标准输出设备(如显示器)发送数据。

  • std::endl:是一个控制字符,用于流插入输出时,相当于插入一个换行字符并刷新缓冲区,确保数据立即显示。

  • 运算符>><< 分别是流提取和流插入运算符,在 C++ 中用于输入输出,不同于 C 语言中的位运算左移和右移。

  • 优势:C++ 的输入输出操作更加便捷,自动识别变量类型,无需手动指定格式,支持自定义类型对象的输入输出,体现了面向对象的特性。

  • 面向对象特性:IO流涉及类和对象、运算符重载、继承等面向对象的概念,这些概念将在后续学习中深入探讨。

  • 命名空间std 是 C++ 标准库所在的命名空间,coutcinendl 等都属于此命名空间。在日常练习中,常用 using namespace std; 来简化调用,但在实际项目中,为了避免命名冲突,建议显式使用 std:: 前缀。

  • 兼容性注意:尽管未明确包含 <cstdio>(提供 printfscanf),在某些编译器环境下(如 VS 系列),它们可能被隐式包含,但在其他编译器上可能需要显式包含才能避免错误。

注意:

对cout的解释,这里里面的函数重载我待会解释

  1. 流插入运算符 <<:当你使用 cout 输出数据时,实际上是将数据通过流插入运算符 << 插入到 cout 流中。例如,cout << 123; 就是将整数 123 插入到 cout 流中。

  2. 类型转换cout 在背后做了大量的工作,将你提供的数据类型转换成文本格式。例如,如果你有一个整数 123cout 会将其转换成字符串 "123",然后再输出到屏幕上。

  3. 函数重载cout 的这种能力是通过函数重载实现的。cout 实际上是一个 ostream 类型的对象,ostream 类为各种数据类型重载了 << 运算符。这意味着 << 运算符根据左右两边的数据类型,会选择正确的重载版本来执行正确的转换和输出操作。

  4. 缓冲与刷新cout 输出的数据会被暂时存储在一个缓冲区中,直到缓冲区满或者程序显式要求刷新(如使用 endl)。这有助于提高性能,因为一次性写入大量数据比频繁写入单个小数据块效率更高。

这边我就不和大家说那些没用的废话直接上代码,我在代码下面放个解析

#include<iostream>
using namespace std;

int main() {
	//一
	int a = 10;
	cin >> a;
	cout << a << endl;

	//二
	int b, c, d;
	cin >> b >> c ;
	cout << b << endl << c << endl;
	cout << b << " " << c << ' ' << endl;


}

解析

#include<iostream>

这行代码包含了标准输入输出库(iostream),使得程序可以使用输入输出相关的功能,如cin和cout。

1using namespace std;

这行代码告诉编译器使用std命名空间,这样我们就可以直接使用cout和cin等函数,而不需要每次都写std::cout或std::cin。

1    int a = 10;

声明了一个整型变量a,并初始化为10。

1    cin >> a;

从标准输入读取一个整数并将其存储在变量a中。这会覆盖之前给a的初始值10。

1    cout << a << endl;

输出变量a的值到标准输出(通常是屏幕),并在后面添加一个换行符。

1    int b, c, d;

声明了三个整型变量b、c和d。

1    cin >> b >> c ;

从标准输入读取两个整数,分别存储在变量b和c中。

1    cout << b << endl << c << endl;

输出变量b和c的值,每个值后都加上一个换行符,使得b和c的值在不同的行显示。

1    cout << b << " " << c << ' ' << endl;

输出变量b和c的值,中间用空格分隔,然后在最后添加一个换行符。

缺省函数

定义
  • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把 缺省参数也叫默认参数)
  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左 依次连续缺省,不能间隔跳跃给缺省值。
  • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参
  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省 值。
代码举例

这里我们缺省了1这个参数(半缺省)

这边我还可以直接缺省两个参数(全缺省)

你不要觉得这个没有用,比如你在开空间扩容的时候,你就可以给一个默认值,就会方便很多,如果突然需要一个很大的空间,你直接传个值过去就覆盖掉默认值


重载函数

        C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C++函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。

这个在C语言就是没有的,你们会发现有了这个重载函数会非常爽,在C语言中,如果我们换了一个类型,我们就的重新命一个函数,不支持一个函数名支持多个种类型

在定义重载函数,一定保持参数顺序相同,不然就会报错,这也是老登规定的,没有为什么

返回值不同不能作为重载条件,因为调⽤时也⽆法区分

我们来看一个纯在歧义的重载函数,这种以后千万别写,我感觉有一点画蛇添足

不传参,会报错,因为第一个无参,第二个是缺省函数

当我给他传上参数他又满血复活了,哈哈哈

引用

引用的概念和意义

引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间, 它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋 ⻛";林冲,外号豹⼦头

类型& 引用别名 = 引用对象

C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的>,这⾥引⽤也和取 地址使⽤了同⼀个符号&,⼤家注意使⽤⽅法⻆度区分就可以。(吐槽⼀下,这个问题其实挺坑的,个 ⼈觉得⽤更多符号反⽽更好,不容易混淆

其实简单来说就是取了个别名

我们打印一下他们的地址看一下是不是一样

其实这里已经说明了他们底层是指针,大家可能觉得这样写会有点怪,哈哈,其实这个在函数传参的时候,会非常方便

引用的特性
  • 引用在定义时必须初始化
  •  ⼀个变量可以有多个引用
  •  引用一旦引用一个实体,再不能引用其他实体

这里有一个案例,很多同学喜欢把这个认为是在改变a

这里的c只有一个赋值作用,我们可以看出地址是不一样的,如果这里认为c是在改变a的话说明你C语言指针需要复习一下,哈哈哈,加油少年

引用的使用
  • 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被 引⽤对象。
  • 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
  • 引⽤返回值的场景相对⽐较复杂,我们在这⾥简单讲了⼀下场景,还有⼀些内容后续类和对象章节 中会继续深⼊讲解。
  • 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代。C++的引⽤跟其他 语⾔的引⽤(如Java)是有很⼤的区别的,除了⽤法,最⼤的点,C++引⽤定义后不能改变指向, Java的引⽤可以改变指向。
  • ⼀些主要⽤C代码实现版本数据结构教材中,使⽤C++引⽤替代指针传参,⽬的是简化程序,避开 复杂的指针,但是很多同学没学过引⽤,导致⼀头雾⽔。

接下来我用代码解释这个引用的应用

看吧,我这个很形象了吧,用引用的话,我们就可以不用再传参数的时候写一个&地址符,这样也好理解一点,我估计有可能老登也觉得指针有一点太复杂了

这种千万不要觉得奇怪,他是一个LTNode*的指针传参,自然也要是LTNode*的别名来接收

这边还没有写完后面还有一些内容,明天补,哈哈哈

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

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

相关文章

掌握计算机网络基础:从零开始的指南

计算机网络是现代信息社会的重要基石。本文将以简洁明了的方式为基础小白介绍计算机网络的基本概念、分类、以及其在信息时代中的重要作用。 计算机网络在信息时代中的作用 21世纪是以数字化、网络化、信息化为重要特征的信息时代。 计算机网络作为信息的最大载体和传输媒介&…

微信自动加好友工具

批量导入数据到后台&#xff0c;可设置添加速度、间隔时间、验证信息和自动备注等&#xff0c;任务执行时间&#xff0c;后台会自动执行操作。

ubuntu 分区情况

ubuntu系统安装与分区指南 - Philbert - 博客园 (cnblogs.com)https://www.cnblogs.com/liangxuran/p/14872811.html 详解安装Ubuntu Linux系统时硬盘分区最合理的方法-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1711884

基于flask的猫狗图像预测案例

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

uni-app 封装http请求

1.引言 前面一篇文章写了使用Pinia进行全局状态管理。 这篇文章主要介绍一下封装http请求&#xff0c;发送数据请求到服务端进行数据的获取。 感谢&#xff1a; 1.yudao-mall-uniapp: 芋道商城&#xff0c;基于 Vue Uniapp 实现&#xff0c;支持分销、拼团、砍价、秒杀、优…

2024年6月总结 | 软件开发技术月度回顾(第一期)

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ Hello&#xff0c;大家好啊&#xff01;随着欧洲杯和奥运会的临近&#xff0c;2024 年下半年的序幕也随之拉开。回顾 2024 年上半年的技术圈&#xff0c;我们看到了一系列令人振奋的进展…

ELfK logstash filter模块常用的插件 和ELFK部署

ELK之filter模块常用插件 logstash filter模块常用的插件&#xff1a; filter&#xff1a;表示数据处理层&#xff0c;包括对数据进行格式化处理、数据类型转换、数据过滤等&#xff0c;支持正则表达式 grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名…

51单片机嵌入式开发:5、按键、矩阵按键操作及protues仿真

按键、矩阵按键操作及protues仿真 1 按键介绍1.1 按键种类1.2 按键应用场景 2 按键电路3 按键软件设计3.1 按键实现3.2 按键滤波方法3.3 矩阵按键软件设计3.4 按键Protues 仿真 4 按键操作总结 提示 1 按键介绍 1.1 按键种类 按键是一种用于控制电子设备或电路连接和断开的按…

LLM之RAG实战(四十一)| 使用LLamaIndex和Gemini构建高级搜索引擎

Retriever 是 RAG&#xff08;Retrieval Augmented Generation&#xff09;管道中最重要的部分。在本文中&#xff0c;我们将使用 LlamaIndex 实现一个结合关键字和向量搜索检索器的自定义检索器&#xff0c;并且使用 Gemini大模型来进行多个文档聊天。 通过本文&#xff0c;我…

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…

Python 安装Numpy 出现异常信息

文章目录 前言一、包源二、安装完成异常 前言 安装Python Numpy包出现异常问题 Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. 一、包源 使用默认的包源出现超时异常&#xff0c;改用清华包源 pip …

娱乐圈幕后揭秘孙俪天选打工人

【娱乐圈幕后揭秘&#xff1a;孙俪“天选打工人”背后的热议风暴】在聚光灯下光鲜亮丽的娱乐圈&#xff0c;每一位明星的日常备受瞩目。近日&#xff0c;实力派演员孙俪在社交媒体上分享了一段片场棚拍的趣事&#xff0c;本是无心之举&#xff0c;意外引爆了网络热议的导火索。…

这几类人,千万不要买纯电车

文 | AUTO芯球 作者 | 响铃 纯电车的冤大头真是太多了&#xff0c; 我之前劝过&#xff0c;有些人不适合买纯电车&#xff0c; 你们看&#xff0c;果然吧&#xff0c;麦卡锡最近的一份报告就披露了 去年啊&#xff0c;22%的人在买了电车后后悔了&#xff0c; 这些人说了&a…

面试常考题---128陷阱(详细)

1.问题引入 分别引入了int和Integer变量&#xff0c;并进行比较 int b 128; int b1 128;Integer d 127; Integer d1 127;Integer e 128; Integer e1 128;System.out.println(bb1); System.out.println(dd1); System.out.println(ee1); System.out.println(e.equals(e1)…

kafka系列之offset超强总结及消费后不提交offset情况的分析总结

概述 每当我们调用Kafka的poll()方法或者使用Spring的KafkaListener(其实底层也是poll()方法)注解消费Kafka消息时&#xff0c;它都会返回之前被写入Kafka的记录&#xff0c;即我们组中的消费者还没有读过的记录。 这意味着我们有一种方法可以跟踪该组消费者读取过的记录。 如前…

【力扣高频题】014.最长公共前缀

经常刷算法题的小伙伴对于 “最长”&#xff0c;“公共” 两个词一定不陌生。与此相关的算法题目实在是太多了 &#xff01;&#xff01;&#xff01; 之前的 「动态规划」 专题系列文章中就曾讲解过两道相关的题目&#xff1a;最长公共子序列 和 最长回文子序列 。 关注公众…

跨境电商代购系统与电商平台API结合的化学反应

随着全球化的不断推进和互联网技术的飞速发展&#xff0c;跨境电商已成为国际贸易的重要组成部分。跨境电商代购系统作为连接国内外消费者与商品的桥梁&#xff0c;不仅为消费者提供了更多元化的购物选择&#xff0c;也为商家开辟了更广阔的市场空间。在这一过程中&#xff0c;…

如何将heic转jpg格式?四种图片格式转换方法【附教程】

如何把heic转jpg格式&#xff1f;heic是用于存储静态图像和图形的压缩格式&#xff0c;旨在以更小的文件大小保持高质量的图像。HEIC格式自iOS 11和macOS High Sierra&#xff08;10.13&#xff09;内测开始&#xff0c;被苹果设置为图片存储的默认格式&#xff0c;广泛应用于i…

【VUE基础】VUE3第四节—核心语法之computed、watch、watcheffect

computed 接受一个 getter 函数&#xff0c;返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。 创建一个只读的计算属性 ref&#xff1a; <template><div cl…

【一次成功】清华大学和智谱AI公司的ChatGLM-4-9B-Chat-1M大模型本地化部署教程

【一次成功】清华大学和智谱AI公司的ChatGLM-4-9B-Chat-1M大模型本地化部署教程 一、环境准备二、ChatGLM-4-9B-Chat-1M简介三、模型下载2.1 安装Git LFS2.2 初始化仓库2.3 同步Git文件2.4 拉取文件2.5 下载完毕 四、python和源码安装与下载4.1 安装python4.2 下载源码4.3 安装…