Fork me on GitHub

C++ Primer Plus 学习笔记一

从零开始接触C++

在经历了种种困难(其实并没有太多)之后,我开了这篇博客,在此记录我从头开始学习C++的历程。参考教材:《C++ Primer Plus (第六版) 中文版》
目录按照教材的目录记录

第1章 预备知识

大纲

·C语言和C++的发展历史和基本原理。
·过程性编程和面向对象编程。
·C++是如何在C语言的基础上添加面向对象概念的。
·C++是如何在C语言的基础上添加泛型编程概念的。
·编程语言标准。
·创建程序的技巧。
本章内容请在书上阅读,这里不再赘述,以下是大纲。

C++简介

C++简史

1.2.1 C语言
1.2.2 C语言编程原理
1.2.3 面向对象编程
1.2.4 C++和泛型编程
1.2.5 C++的起源

可移植性和标准

1.3.1 C++的发展
1.3.2 本书遵循的C++标准

程序创建的技巧

1.4.1 创建源代码文件
1.4.2 编译和链接

总结

第2章 开始学习C++

大纲

·创建C++程序。
·C++程序的一般格式。
·#include编译指令。
·main()函数。
·使用cout对象进行输出。
·在C++程序中加入注释。
·何时以及如何使用endl。
·声明和使用变量。
·使用cin对象进行输入。
·定义和使用简单函数。

进入C++

下面是教材中的一个cpp程序的源代码,我们从这个程序开始逐步理清楚。

1
2
3
4
5
6
7
8
9
10
//myfirst.cpp -- displays a message  
#include <iostream> // a PREPROCESSOR directive
int main() // function header
{ // start of function body
using namespace std; // make definitions visible
cout << "Come up and C++ me some time.";// message
cout << endl; // start a new line
cout << "You won't regret it!"<<endl; // more output
return 0; // terminate main()
} // end of function body

从某种意义上来讲,C++和C语言有很大的相似之处,因此我们直接将略过和C语言相似的部分。

头文件名

第一行代码是#include ,和C语言类似,像iostream这样的文件叫做包含文件(include file)——由于被包含在其他的文件中,也称作头文件(header file)。C语言的头文件一般使用h扩展名,但C++却没有扩展名。有些C头文件被转换为C++头文件,这些文件在文件名称上加上前缀c,例如C++版本的math.h则是cmath。对于纯粹的C++头文件来讲,去掉h后的头文件还可以包含名称空间。

名称空间

注意到和C语言不同的是那一句

1
using namespace std;

这叫做using编译指令,在后面会进行深度的学习,现在仅仅只作了解。
名称空间支持是一项C++特性,旨在编写大型程序时以及将多个厂商现有代码组合起来更加容易,它也有助于组织程序。一个潜在的问题是,如果使用两个封装好产品,而它们都有一个叫做tietie()的函数,那么编译器将不知道是使用哪一个tietie()。名称空间使得厂商可以将其产品封装在一个叫做名称空间的单元中,这样便能用其来指出想要使用哪个厂商的产品。因此,Meaqua Industries可以将其定义放到一个叫做Meaqua的名称空间中。如此一来,其tietie()函数的全程就是Meaqua::tietie();同样,HimeHina公司的tietie()版本可以表示为HimeHina::tietie()。这样,程序就能使用名称空间来区分不同的版本了。

1
2
Meaqua::tietie("Meaquaraft");	// use Meaqua namespace version
HimeHina::tietie("Yuki"); // use HimeHina namespace version

因此来讲,上面的iostream定义的输出的cout变量其实是std::cout,endl实际上是std::endl。因此也可以省略using,以下述方式编码:

1
2
std::cout << "Come up and C++ me some time.";
std::cout << std::endl;

然而,多数用户并不喜欢将引入名称空间之前的代码(使用iostream.h和cout)转换为名称空间代码(使用iostream和std::cout),除非他们可以毫不费力地完成这种转换。于是,using指令便应运而生了。下面的代码表示可以使用std名称空间定义的名称,而不必使用std::前缀:

1
using namespace std;

这个using编译指令使得std名称空间中的所有名称均可用。这是一种偷懒的做法,在大型项目中会有潜在的问题。更好的方法是,只使得需要的名称可用,这也可以通过using实现:

1
2
3
4
using std::cout;		// make cout available
using std::endl; // make endl available
using std::cin; // make cin available
using Meaqua::tietie; // make tietie available

关于cout

注意到myfirst.cpp中的以下语句:

1
cout << "Come up and C++ me some time.";

双引号中是要打印的消息。C++中将其称作字符串。<<符号表示将这个字符串发送给cout;该符号指出了信息流动的路径。那么什么是cout?它是一个预定义的对象,知道如何显示字符串、数字和单个字符等。
cout有一个简单的接口,如果string是一个字符串,则下面的代码将显示该字符串:

1
cout << string;

和C语言中的printf()有些不同,与其将cout显示了一条字符串,倒不如说是将字符串插入到输出流(从C++概念上来看,输出是一个流,即从程序流出的一系列字符)中。cout对象表示这种流,其属性在iostream中定义。cout的对象属性中包含有一个插入运算符(<<),它可以将右侧信息插入到流中。

初识运算符重载

注意到插入运算符和按位左移运算符(在C语言中进行位运算时执行向左移位操作的符号)似乎是有极大的相似性,这是一个运算符重载的例子,通过重载,同一个运算符将有不同的含义。编译器通过上下文来确定运算符的含义。在C语言中,也有这种例子,例如&符号,既可以表示地址运算符,也可以表示按位与运算符。*即表示乘法,也表示指针的解引用。C++扩展了运算符重载的概念,允许用户定义的类型(类)重新定义运算符的含义。

cout和printf()

和printf()相比,cout设计更加灵活、好用,并且它是可扩展的(extensible)。也就是说,可以重新定义<<运算符,使得cout可以识别并显示开发的新数据类型。若是喜欢printf()提供的细致控制功能,可以使用更高级的cout来获得相同效果,这将在之后的学习中提到。

0%