从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

目录
相关文章
|
10天前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
1月前
|
存储 编译器 C语言
【C语言程序设计——入门】C语言入门与基础语法(头歌实践教学平台习题)【合集】
本文档介绍了C语言环境配置和编程任务,主要内容包括: - **C语言环境配置**:详细讲解了在Windows系统上配置C语言开发环境的步骤。 - **第1关:程序改错**:包含任务描述、相关知识(如头文件引用、基本语法规则)、编程要求、测试说明及通关代码。 - **第2关:scanf函数**:涉及`scanf`和`printf`函数的格式与使用方法,提供编程要求、测试说明及通关代码。 文档结构清晰,涵盖从环境搭建到具体编程任务的完整流程,适合初学者学习和实践。
56 4
|
1月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
49 1
|
2月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
128 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
2月前
|
算法 编译器 C语言
【C语言】C++ 和 C 的优缺点是什么?
C 和 C++ 是两种强大的编程语言,各有其优缺点。C 语言以其高效性、底层控制和简洁性广泛应用于系统编程和嵌入式系统。C++ 在 C 语言的基础上引入了面向对象编程、模板编程和丰富的标准库,使其适合开发大型、复杂的软件系统。 在选择使用 C 还是 C++ 时,开发者需要根据项目的需求、语言的特性以及团队的技术栈来做出决策。无论是 C 语言还是 C++,了解其优缺点和适用场景能够帮助开发者在实际开发中做出更明智的选择,从而更好地应对挑战,实现项目目标。
141 0
|
4月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
46 0
|
4月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
50 0
|
4月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
28 0
|
4月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
4月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)