从零开始接触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
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语言不同的是那一句1
using namespace std;
这叫做using编译指令,在后面会进行深度的学习,现在仅仅只作了解。
名称空间支持是一项C++特性,旨在编写大型程序时以及将多个厂商现有代码组合起来更加容易,它也有助于组织程序。一个潜在的问题是,如果使用两个封装好产品,而它们都有一个叫做tietie()的函数,那么编译器将不知道是使用哪一个tietie()。名称空间使得厂商可以将其产品封装在一个叫做名称空间的单元中,这样便能用其来指出想要使用哪个厂商的产品。因此,Meaqua Industries可以将其定义放到一个叫做Meaqua的名称空间中。如此一来,其tietie()函数的全程就是Meaqua::tietie();同样,HimeHina公司的tietie()版本可以表示为HimeHina::tietie()。这样,程序就能使用名称空间来区分不同的版本了。1
2Meaqua::tietie("Meaquaraft"); // use Meaqua namespace version
HimeHina::tietie("Yuki"); // use HimeHina namespace version
因此来讲,上面的iostream定义的输出的cout变量其实是std::cout,endl实际上是std::endl。因此也可以省略using,以下述方式编码:1
2std::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
4using 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来获得相同效果,这将在之后的学习中提到。
