这个专栏是优质的C++教程专栏,如果你还没看过第一篇,点击这里去第一篇
本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C++编译器:Clang
感谢支持的朋友,上一篇文章成为了C/C++领域第1!综合热榜第64!(仍然在提高哦),也被极客日报的8月6日今日值得看收录了!作者也成为了北京原力第61名(仍然在提高哦)^ _ ^
博主反馈非常及时,如果你在阅读的时候遇到问题,可以直接在评论区提问,博主看到后会在24小时内给你反馈
C++教程 - How to C++系列专栏第2篇
目录
关于专栏
更新记录
2023年8月6日
前言
C++预处理器及头文件
预处理器
头文件
名称空间
cout
cout
endl
C++源代码格式
结语
快捷翻页
本文参考文章,书籍
发布第一篇文章
什么是预处理器?什么是头文件?能吃吗?名称空间是什么?起名字的地方?源代码格式?笑死,写代码还有格式?
如果程序要使用 C++输入或输出工具,请提供这样两行代码
#include
using namespace std;
可使用其他代码替换第 2 行,这里使用这行代码旨在简化该程序。为使程序正常工作只需要知道这些。下面更深入地介绍一下这些内容
C++和 C 一样,使用一个预处理器,该程序在进行主编译之前对源文件进行,即它处理名称以#开头的编译指令,不必执行任何特殊的操作来调用该预处理器,它会在编译程序时自动运行。
之前的代码中使用了#include编译指令
#include
这个编译指令会把iostream文件的内容添加到当前程序中,这是一种典型的预处理器操作:在源代码被编译之前,替换或添加文本
可是,为什么要把iostream文件添加到程序中?
因为要将程序内部与外部进行通讯,iostream中的io是指输入(input)和输出(output)
C++的输入输出方案涉及iostream文件中的很多定义,为了使用cout来显示消息,第一个程序需要这些定义。#inciude编译指令将iostream文件的内容和源代码文件的内容一起被发送给编译器。实际上,iostream 文件的内容将取代程序中的代码行#include
iostream这样的文件被称为头文件,因为他们被包含在文章起始处,C++编译器自带很多头文件,每个头文件都有各自的一种工具,C语言的传统是:头文件使用扩展名.h,作为一种很方便的表示文件类型的方法,比如math.h文件就能为C提供很多数学函数
但,C++的用法变了
老式C头文件仍然可以使用,但相当一部分的头文件已经被转换为C++头文件,这些文件被重新命名,加上了前缀“c”说明它来自C,举个例子:C++版本的math.h头文件变成了cmath。
对于纯粹的C++头文件,比如iostream,去掉h不光是名称上的变化,也可能包含了名称空间
头文件类型 | 形式 | 例子 | 说明 |
---|---|---|---|
C++老式风格 | 使用.h结尾 | iostream.h | C++程序可以使用 |
C老式风格 | 使用.h结尾 | math.h | C与C++文件头可以使用 |
C++新风格 | 没有扩展名 | iostream | C++程序可以使用 |
转换后的C | 没有扩展名 前缀加c |
cmath | C++文件可以使用,可以使用不是C的特性 |
如果使用iostream,而不是iostream.h,那么就要用下面的名称空间编译指令来使iostream中的定义对程序可用
using namespace std;
这是using编译指令,我们之后再讲解它,现在先简单解释一下名称空间是什么
名称空间是一项C++特性,在编写大型程序以及将多个厂商现有的代码组合起来的程序时更容易,还有助于组织程序
我们在未来可能涉及到一个潜在的问题:
可能使用两个已封装好的产品,而它们都包含一个名为hello()的函数。这样,使用hello()函数时,编译器将不知道指的是哪个版本。名称空间让厂商能够将其产品封装在一个叫作名称空间的单元中,这样就可以用名称空间的名称来指出想使用哪个厂商的产品
因此,厂商A可以将其定义放到一个名为A的名称空间中,这样,其hello()函数的全称为A::hello();
同样,厂商B的hello()版本可以表示为B::hello()
这样,程序就可以使用名称空间来区分不同的版本了:
A::hello("hello?");
B::hello("hello!");
按照这种方式,类、函数和变量便是C++编译器的标准组件,它们现在都被放置在名称空间 std 中。仅当头文件没有扩展名.h时,情况才是如此。这意味着在iostream中定义的用于输出的cout变量实际上是 std::cout,而 endl 实际上是 std::endl。所以我们可以省略编译指令using,写成下面的形式
std::cout << "How to C++" << std::endl;
当然,在使用using namespace std;后就不必使用“std::”了
还有一种方法,单独使用每一个函数
using std::cout;
using std::endl;
这种情况下,使用cout的时候就不必加上“std::”了
first.cpp的一段输出代码如下:
cout << "This is my first C++ program!" << endl;
双引号括起的部分是要打印的消息。在 C++中,用双引号括起的一系列字符叫作字符串,因为它是由很多字符组合而成
“<<”符号表示该语句将把这个字符串发送给 cout; 该符号指出了信息流动的路径
cout是什么?
它是一个预定义的对象,知道如何显示字符串、数字和单个字符等[todo:C++教程 - How to C++系列专栏第0篇讲解对象与类,大家不要着急了]
马上就使用对象可能有些闲难,因为几章后才会介绍对象。这演示了对象的长处:不用了解对象的内部情况,就可以使用它。只需要知道它的接口和如何使用它
cout 对象有一个简单的接口,如果 a 是一个字符串,则下面的代码将显示该字符串:
cout << a;
对子显示字符串而言,只需知道这此即可
现在来看看 C++从概念上如何解释这个过程:从概念上看,输出是一个流,就是从程序流出的一堆字符,cout对象表示这种流,它的属性是在 iostream文件中定义的。cout 的对象属性包括一个插入运算符<<,它可以把其右侧的信息插人到流中,比如下面的例子
cout << "欢迎订阅专栏";
它将字符串“欢迎订阅专栏”插人到输出流中。因此,与其说程序显示了一条消息,不如说它将一个字符串插人到了输出流中
endl的含义为:重启一行,把光标移动到下一行开头
从硬件(如显示器)来看,输入/输出东西是很耗时的,所以平时写入到cout里的东西,程序会将其暂存起来,不会马上显示出去。只有当存满一定量,或者接收到endl时才会将缓存的数据显示到控制台
所以可以理解为:end line
C++还有一种换行方式:“\n”
“\n”不能被视为两个字符,它其实是一个字符,作为一个整体存在,但“\n”在cout中并不具备endl刷新缓存的功能,所以,我们一般使用endl,在使用“\n”的时候需要加上双引号,比如下面这样:
cout << "快点赞收藏关注" << "\n";
有些语言是一行被视为一个语句,比如Python,在博主过度到C++到时候也很不适应分号,总是会有结尾缺少分号的问题,C++的一条语句是由分号决定的,所以你的程序也可以写成这样:
#include
int
main
(void)
{
using
namespace
std; cout
<<
"一定要点赞收藏关注"
<< endl;
cout
<< "订阅专栏哦";
cout
<<
endl;
return
0;}
虽然这样会被骂[doge],但是仍然可以编译通过(博主亲自试了一下,你们也可以试试),但是,千万不能在元素中间加空格或者换行,例如:
i nt mai n (void)
---
re
turn 0;
---
cout << "点赞收藏
关注";
这里建议大家遵守以下代码风格:
作者会经常帮助有问题的小伙伴解决问题如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复
如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注
如果你们身边有像你提起过这个领域的,或者希望可以和ta一起进步的,把本文分享给ta吧
3762字,10个父项,5个子项
上一篇
博主其他优质文章:
Hexo教程,看这一篇就够了- How to系列
Apple WWDC23开发者大会——Apple的野心
如何在CSDN写高质量博客-How to系列
参考文章
C++ cout的使用,看这一篇就够了 - 知乎
请问std::cout << 中的<<是什么作用啊? - 知乎
C++中endl的本质是什么_c++ endl_xiaofei0859的博客-CSDN博客
参考书籍
C++ Primer Plus