C++之旅——入门

news/2024/11/7 14:18:03/

Hello,各位小伙伴们,前几期我们学习了C语言和数据结构,有了一定的基础之后我们来挑战新的语言——C++。

目录

一、初识C++

1>C++发展历史

 2>C++版本更新

3>C++的热度

4>C++的学习难度

5>C++学习相关书籍

 二、第一个C++代码

三、C++基础

1>命名空间的介绍

2>命名空间的使用

1、指定命名空间

2、使用using展开命名空间的指定成员

3、使用using展开整个命名空间

3>C++输入&输出​


一、初识C++

相信很多小伙伴和小编一样认为C语言和C++必然有着联系,确实在C语言诞生之后存在很多的不足,C++在其基础上进行不断的优化,逐渐演化为一门新的语言。让我们一起来阅读一下C++的发展史吧!

1>C++发展历史

        C++的起源可以追溯到1979年,当时Bjarne Stroustrup(本贾尼·斯特劳斯特卢普,这个翻译的名字不同的地方可能有差异)在贝尔实验室从事计算机科学和软件工程的研究工作。面对项目中复杂的软件开发任务,特别是模拟和操作系统的开发工作,他感受到了现有语言(如C语言)在表达能力、可维护性和可扩展性方面的不足。
1983年,Bjarne Stroustrup在C语言的基础上添加了面向对象编程的特性,设计出了C++语言的雏形,此时的C++已经有了类、封装、继承等核心概念,为后来的面向对象编程奠定了基础。这一年该语言被正式命名为C++。​在随后的几年中,C++在学术界和工业界的应用逐渐增多。一些大学和研究所开始将C++作为教学和研究的首选语言,而一些公司也开始在产品开发中尝试使用C++。这一时期,C++的标准库和模板等特性也得到了进一步的完善和发展。
        C++的标准化工作于1989年开始,并成立了一个ANSI和ISO(International Standards 
Organization)国际标准化组织的联合标准化委员会。1994年标准化委员会提出了第一个标准化草案。在该草案中,委员会在保持斯特劳斯特卢普最初定义的所有特征的同时,还增加了部分新特征。
        在完成C++标准化的第一个草案后不久,STL(Standard Template Library)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。在通过了标准化第一个草案之后,联合标准化委员会投票并通过了将STL包含到C++标准中的提议。STL对C++的扩展超出C++的最初定义范围。虽然在标准中增加STL是个很重要的决定,但也因此延缓了C++标准化的进程。​
        1997年11月14日,联合标准化委员会通过了该标准的最终草案。1998年,C++的ANSI/IS0标准被投入使用。

 

 2>C++版本更新

这里给大家介绍一些C++的网站https://legacy.cplusplus.com/reference/​icon-default.png?t=O83Ahttps://legacy.cplusplus.com/reference/%E2%80%8B

 这个网站是小编比较爱使用的对于一些不太清楚的函数使用直接搜索即可但较为官方的网站为

https://zh.cppreference.com/w/cpp​icon-default.png?t=O83Ahttps://zh.cppreference.com/w/cpp%E2%80%8B

 根据大家的喜好来选择即可!

3>C++的热度

随着近几年的人工智能的发展,python的热度逐年升高,如果你已经学习完C语言了,在学习起来python就会非常顺手,这是今年语言热度排行榜。

C/C++名列前茅,但在一定程度上二者热度有所下降。

4>C++的学习难度

给大家看一个具有戏剧性的图片

 哈哈!也只是一个小小的玩笑,相信大家好好学习C++并不断练习就一定能够攻克难关。

5>C++学习相关书籍

这是小编在网上找到的三本比较推荐的书籍小编也才刚入门C++,但对于刚入门C++来说有一定难度,待我们有了一定的基础以后再来阅读也不迟。

三本书的介绍:

C++ Primer:主要讲解语法,经典的语法书籍,前后中期都可以看,前期如果自学看可能会有点晦涩难懂
STL源码剖析:主要从底层实现的角度结合STL源码,庖丁解牛式剖析STL的实现,是侯捷老师的经典之作。可以很好的帮助我们学习别人用语法是如何实现出高效简洁的数据结构和算法代码,如何使用泛型封装等。让我们不再坐井观天,闭门造车,本书课程上一半以后,中后期可以看。
Effctive C++:本书也是侯捷老师翻译的,本书有的一句评价,把C++程序员分为看过此书的和没看过此书的。本书主要讲了55个如何正确高效使用C++的条款,建议中后期可以看一遍,工作1-2年后再看一遍,相信会有不一样的收获。

 二、第一个C++代码

任何一个牛掰的程序猿第一个代码都是hello world 。

#include<iostream>
int main ()
{str::cout << "hello world " << endl;return 0;
}

 让我们来对比一下C语言和python。

#include<stdio.h>
int main()
{printf("hello world");return 0;
}
print("hello")

由此也可以看出C++的复杂度。

三、C++基础

我们在做一个项目时,需要多人协作一起来完成,难免会有多个人使用同一个变量名,这样就会造成很大的麻烦。所以在C++上加上命名空间这个概念。

1>命名空间的介绍

namespace的定义:定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。​

让我们在VS上模拟一下:

 在这和程序中我们在全局中定义了rand,但同时包含了头文件#include<stdlib.h>,在这个头文件中已经包含这个rand函数,会有重定义报错,这样就模仿了上述情景。在此情景下我们就需要使用命名空间域,namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量,所以下面的rand不在冲突了。

如果想要访问其中的rand需要加上命名空间域名+::

同时命名空间域可以嵌套使用,比如:

#include<iostream>
namespace Sum
{namespace add{int Fuction(int x, int y){return x + y;}}namespace mul{int Fuction(int x, int y){return x * y;}}
}
int main()
{printf("%d ", Sum::add::Fuction(2, 3));printf("%d ", Sum::mul::Fuction(3, 4));return 0;
}

我们在全局域中定义了命名空间域Sum,又在其中分别定义了add 和 mul,虽然里面的函数名称一致,但并不影响他们的使用。

多文件中可以定义同名namespace,他们会默认合并到一起,就像同一个namespace一样​。

2>命名空间的使用

我们指定输出或者查找一个变量时,首先会在局部范围内查找,其次在全局范围内查找,不会到命名空间里面去查找。所以下面程序会编译报错。

 和上面一开始rand报错原因时一致的,我们可以通过三种方式解决:

1、指定命名空间

#include<iostream>
namespace byte
{int a = 1;int b = 2;
}
int main ()
{printf("%d ",byte::a);return 0;
}

2、使用using展开命名空间的指定成员

#include<iostream>
namespace byte
{int a = 1;int b = 2;
}
using byte::a;
int main ()
{printf("%d ",a);return 0;
}

3、使用using展开整个命名空间

#include<iostream>
namespace byte
{int a = 1;int b = 2;
}
using namespace byte;
int main ()
{printf("%d ",a);printf("%d ",b);return 0;
}

展开命名空间中全部成员,项目不推荐,冲突风险很大,日常小练习程序为了方便推荐使用。

3>C++输入&输出​

<iostream> 是 Input Output Stream 的缩写,是标准的输入、输出流库,定义了标准的输入、输出对象。
• std::cin 是 istream 类的对象,它主要面向窄字符(narrow characters (of type char))的标准输入流。
• std::cout 是 ostream 类的对象,它主要面向窄字符的标准输出流。​
• std::endl 是一个函数,流插入输出时,相当于插入一个换行字符加刷新缓冲区。​
• <<是流插入运算符,>>是流提取运算符。(C语言还用这两个运算符做位运算左移/右移)
• 使用C++输入输出更方便,不需要像printf/scanf输入输出时那样,需要手动指定格式,C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的,这个以后会讲到),其实最重要的是C++的流能更好的支持自定义类型对象的输入输出。​
cout/cin/endl等都属于C++标准库,C++标准库都放在一个叫std(standard)的命名空间中,所以要通过命名空间的使用方式去用他们。
• 一般日常练习中我们可以using namespace std,实际项目开发中不建议using namespace std。​
• 这里我们没有包含<stdio.h>,也可以使用printf和scanf,在包含<iostream>间接包含了。vs系列编译器是这样的,其他编译器可能会报错.

 相信看到这里的小伙伴应该已经了解到了C++的第一个代码会是那样书写。

对于输入输出我们就有了大致的了解:

 初学的小伙伴可以会把cin的>>和cout<<搞混,小编在这里想到了一种便于记忆的方法:

在执行输入操作cin时箭头所指的方向便是输入的顺序。

在执行输出操作cout时,将cout看作输出终端,从左到右依次输出。

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

 

 在函数调用缺少参数的情况下,会默认在函数定义里面的参数,如果在函数调用时设置了参数,则会按照设置的参数进行。

这就有点像小编在学校里学习的python了,哈哈哈哈。

OK,今天的内容就到这里啦,小编会及时更新C++博客,希望小伙伴们能够及时跟上小编的步伐,我们下期再见。


http://www.ppmy.cn/news/1545088.html

相关文章

[晕事]今天做了件晕事50 dev_ioctl 里没有SIOCADDTUNNEL?

今天又晕了一下&#xff0c;在看添加GRE隧道的代码&#xff0c;发现这个dev_ioctl里没有关于这个SIOCADDTUNNEL处理&#xff1f; 后来发现不是没有&#xff0c;而是被下面的代码覆盖了&#xff0c;虽然没有明写case语句&#xff0c;但是if判断里已经包含了&#xff0c;使用了大…

【ubuntu18.04】使用U盘制作ubuntu18.04启动盘操作说明

打开show application 打开Startup Disk 选择镜像 双击选择ubuntu的iso镜像 镜像下载地址 Ubuntu 18.04.6 LTS (Bionic Beaver) 制作镜像 注意&#xff1a; 制作镜像会格式化U盘&#xff0c;记得备份资料 点击Make Startup Disk,弹出如下对话框 点击Yes 输入管理员密码&a…

Redis数据库测试和缓存穿透、雪崩、击穿

Redis数据库测试实验 实验要求 1.新建一张user表&#xff0c;在表内插入10000条数据。 2.①通过jdbc查询这10000条数据&#xff0c;记录查询时间。 ②通过redis查询这10000条数据&#xff0c;记录查询时间。 3.①再次查询这一万条数据&#xff0c;要求根据年龄进行排序&#…

【QT】Qt文件和多线程

个人主页~ Qt系统内容 一、Qt文件1、文件读写读写 2、文件和目录信息 二、多线程1、线程使用timethread.hwidget.htimethread.cppwidget.cpp 2、线程安全&#xff08;1&#xff09;互斥锁QMutexQMutexLocker一个例子mythread.hmythread.cppwidget.cpp QReadWriteLocker、QReadL…

gerrit 搭建遇到的问题

1、启动Apache&#xff0c;端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…

Docker篇(容器的备份与迁移)

目录 一、容器保存为镜像 二、镜像备份 三、镜像恢复与迁移 一、容器保存为镜像 docker commit mynginx mynginx_i 目的&#xff1a;主要的作用就是配置好的一些容器&#xff0c;可以得到复用&#xff0c;就不需要重新再次配置了 二、镜像备份 注意是保存在当前执行命令的…

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU部署redis 6.2.14 TLS/SSL哨兵集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、简介 Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障转移,从而确保服务的连续性。哨兵模式的核心组件包括哨兵(Sentine…

在 C# 中,如何实现观察者模式?

观察者模式是一种设计模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当该主题对象的状态发生变化时&#xff0c;会通知所有观察者对象&#xff0c;使它们能够自动更新自己。这个模式常用于事件处理系统、通知系统等场景。…