从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(上)

简介: 从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)

前言

拖了这么久终于开始更传说中的C++了,虽然可能听说C++是掌控一切的,很难,但是认真学还是能学好的。未来改变世界的能力就交给各位了。


本系列文章默认已经学过C语言,并且对数据结构的一小部分知识有简单了解,(只要看过前面的专栏绝对够了)建议在正式开启学习C++之前,可以复习一下C语言相关的知识。

1.认识C++

C语言是结构化、模块化的语言,适合处理较小规模的程序。对于复杂和规模较大的程序,需要高度的抽象和建模时,C语言就太不合适了。C语言是面向过程的程序设计语言。

为了解决软件危机,20世纪80年代,计算机提出了 OOP(Object Oriented Programming),即面向对象思想,支持面向对象的程序设计语言C++就应运而生了。C++是由C语言发展而来的,所以C++兼容C语言,C++ 在西方称为C Puls Puls(CPP)

下图是C++之父---本贾尼

1979年,贝尔实验室的本贾尼等人在试图分析 Unix 内核的时候,试图将内核模块化,于是在C语言的基础上进行扩展,增加了类的机制,完成了一个可以运行的预处理程序,称之为 C with classes。后面在C++的发展中发展到了很多的阶段。下面在1998年定的标注,这个版本之后的 C++ 就相对比较完善了。支持了泛型编程,引入了STL标准模板库。 目前下面阶段重要的是C++98和C++11。

6664930468514c23b874dfd38e10d67a.png

之后C++的更新其实是有点慢的, 比如 C++03 和 C++05 主要是修订一些东西。直到 C++11 才开始新增了新的东西,在这之后 14 17 也是在修订……如今出了 C++20,也是一个备受吐槽的版本,因为没有加啥特性。所以这里主要讲的是C++98和C++11。

2.C++的重要性

C++ 到现在为止已经将近有40年了,目前最主流的两门语言 C/C++ 和 Java,其次就是 Python了,近几年机器学习的算法,上层是用 Python 写的,再其次就是 Go,也是蛮火的。

C# 当年是微软搞出来为了对抗 Java 的语言,C#最大的限制就是他是 Windows 上的,发展路径可能不好。

从语言发展的角度来说,C++是主流语言。再说,学完C++上手其他语言也是非常快的。服务端开发、大型软件、游戏开发……其中游戏开发里很多用的也都是C++。

3.如何学习C++

多敲代码,多总结。记笔记、画思维导图。

常看书:

入门推荐看:高质量程序设计指南————C++/C语言


进阶推荐看: EffectiveC++   C++Primer


看看别人是怎么学的,以及掌握C++的各个阶段:


以下引用自2010年8月号《程序员》刊登的拙文《C++强大背后》最后一段:


C++缺点之一,是相对许多语言复杂,而且难学难精。


许多人说学习C语言只需一本K&R《C程序设计语言》 即可,但C++书籍却是多不胜数。我是从C进入C++,皆是靠阅读自学。在此分享一点学习心得。个人认为, 学习C++可分为4个层次:


第一个层次,C++基础  (平平常常)


挑选一本入门书籍,如《C++ Primer》、《C++大学教程》或Stroustrup撰写的经典《C++程序设计语 言》或他一年半前的新作《C++程序设计原理与实践》,而一般C++课程也止于此,另外《C++ 标准程 序库》及《The C++ Standard Library Extensions》可供参考;


第二个层次,正确高效的使用C++ (驾轻就熟)


此层次开始必须自修,阅读过《(More)Effective C++》、《(More)Exceptional C++》、 《Effective STL》及《C++编程规范》等,才适宜踏入专业C++开发之路;


第三个层次,深入解读C++ (出神入化)


关于全局问题可读《深入探索C++对象模型》、《Imperfect C++》、《C++沉思录》、《STL源码剖析》,要挑战智商,可看关于模版及模版元编程的书籍如《C++ Templates》、《C++设计新思维》、 《C++模版元编程》;


第四个层次,研究C++  (返璞归真)


阅读《C++语言的设计和演化》、《编程的本质》(含STL设计背后的数学根基)、C++标准文件 《ISO/IEC 14882:2003》、C++标准委员会的提案书和报告书、关于C++的学术文献。


建议不要把「精通C++」作为一个一年目标,应该要把学习语言作为一个持续的过程,同时要把语言运用在具体的应用场合中。  

4.编写Hello World!

新生婴儿会以自己独特的方式向这个崭新的世界打招呼,C++刚出来后,也算是一个新事物,

C++是否也应该向这个美好的世界来声问候呢?来看下C++是如何来实现问候的。

打开编译器创建完新项目后,右键源文件,点击 "添加新建项" 。

以前取得是Test.c现在名称我们就取为 Test.cpp,这样代码就能很好地创建出来了:

#include <iostream>
using namespace std;
 
int main()
{
  cout << "Hello World!" << endl;
 
  return 0;
}

1eed1b36309b4fa9810478c1b279223d.png

以上iostream是c++输入输出流的头文件,和C语言的stdio.h类似

using namespace std;是展开std的命名空间

cout 与printf 类似 ,<< 是流输出运算符, endl是换行

和刚学C语言一样,写C++也应该先把框架敲出来,下面详细介绍框架内容。


5.关键字

C++ 标准共计有 63 个关键字 (C++11),其中包括 C 语言的 32 个关键字。

这里不对关键字进行具体的讲解,后续都慢慢会学到的

目前只需要注意一点:命名时要避开这些关键字。

如果把变量命名为关键字,编译器将无法识别这个标识符。从而导致编译错误

注意下面这些关键字,对于刚学完 C 的初学者来说有很多 "生词" ,先混个眼熟:

这里把关键字表列出来,是为了在初学 C++ 时少踩命名的坑。


6.命名空间(namespace)

在 C/C++ 中,变量、函数和类都是大量存在的,这些变量、函数和类的名称,


都会存在于全局作用域中,这么一来就会导致 命名冲突 问题……


C++ 引入了 namespace,只要合理使用,就可以有效地避免命名冲突问题。


使用命名空间的目的:对标识符的名称进行本地化,以避免命名冲突或名字污染。


刚才 Hello World ! 代码中的 namespace 的出现,就是针对这个问题的。


比如在 stdlib 库中有一个生成随机数的函数 rand() ,


相信大家都认识,但是假装某个人不知道 stdlib 库中有一个叫 rand 的函数存在,


因此在定义变量时给变量取名为 rand 。

#include<stdio.h>
#include<stdlib.h>
 
int rand = 525;
 
int main()
{
  printf("%d\n", rand);// 这里到底是打印我们自己定义的rand,还是stdlib里的?
  return 0;
}

我们知道,#include 包含头文件,头文件里的内容是会被展开来的。


当展开头文件时,stdlib 库中有一个叫 rand 的函数,我这里又定义了一个叫 rand 的变量,


此时就冲突了,那么问题来了,这里 printf 打印出来的会是什么呢?


编译器的寻找规则: 局部找 → 全局找 → 找不到(报错)。


问题是在C语言里几乎没有办法很好地解决这种问题。


所以为了很好地解决这种冲突的问题,C++ 就加入了命名空间的特性。


在 C++ 里,我们就可以利用 "命名空间" 来解决这个问题,


所以 C++ 提出了一个新语法 —— 命名空间 namespace。

6.1命名空间的定义

定义命名空间,肯定得用到我们刚才提到的 namespace 关键字,

namespace 后面可以取一个空间名,然后再接上一对大括号就可以了

我们该如何使用它呢?修改上面的代码:

#include<stdio.h>
#include<stdlib.h>
 
namespace rtx // 自己定义的命名空间可以自己随意命名
{
  int rand = 525;
}
 
int main()
{
  printf("%d\n", rtx::rand);//这样就能打印我们定义的rand了
  return 0;
}

这里的 : :  叫做 "作用域限定符" 。这么一来,就不怕冲突了,问题就这么轻松地解决了。

命名空间能够达到一种类似于 "隔离" 的效果。

注意事项:①命名空间必须在全局作用域下定义。其次,正是因为命名空间是全局的,所以这个 rand 变量也自然而然地变成了全局变量。

②命名空间长得有点像结构体,但是它和结构体不是一个东西,结构体是定义一个类型,它们的性质是完全不一样的。还有,命名空间大括号外不用加分号。


从C语言到C++①(第一章_C++入门_上篇)C++学习介绍(命名空间和C++输入输出流)(下):https://developer.aliyun.com/article/1513633?spm=a2c6h.13148508.setting.24.5e0d4f0emCh6wU

目录
相关文章
|
19小时前
|
存储 Web App开发 算法
c语言的简单入门
熟悉c语言(简单入门)
|
19小时前
|
编译器 C语言
|
17小时前
|
安全 编译器 C语言
C++练级之路——C++入门
C++练级之路——C++入门
|
18小时前
|
C语言
|
20小时前
|
C语言 图形学 C++
|
15小时前
|
C语言 图形学 C++
|
15小时前
|
C语言
|
15小时前
|
C语言
|
15小时前
|
C语言
|
16小时前
|
C语言