目录
第1章 预备知识
面向对象编程(OOP)不像过程性编程那样,试图使问题满足语言的过程性方法,而是试图让语言来满足问题的要求。其理念是设计与问题本质特性相对应的数据结构。
C语言新增了诸如控制结构和函数等特性,以便更好地控制程序流程,支持结构化和模块化程度更高的方法;而C++增加了对面向对象编程和泛型编程的支持,这有助于提高模块化和创建可重用代码,从而节省编程时间并提高程序的可靠性。
第2章 开始学习C++
2.1 进入C++
C++能够使用printf()、scanf()和其他所有标准输入和输出函数,只需要包含常规C语言的stdio.h文件。
2.1.1 main()函数
1、作为接口的函数头
函数可被其他函数激活或调用,函数头描述了函数与调用它的函数之间的接口。
如果编译器到达main()函数末尾时没有遇到返回语句,则认为main()函数以如下语句结尾:
return 0;
2、为什么main()不能使用其他名称
常规的独立程序都需要main(),如果没有main(),程序将不完整,运行C++程序时,通常从main()函数开始执行。
2.1.2 C++注释
C++注释以//打头,到行尾结束。
C注释包括在符号/* 和 */之间,可以跨越多行。
2.1.3 C++预处理器和iostream文件
iostream中的io指的是输入和输出。
2.1.4 头文件名
头文件(header file)
2.1.5 名称空间
如果使用iostream,而不是iostream.h,则应使用下面的名称空间编译指令来使iostream中的定义对程序可用:
using namespace std;
这叫做using编译指令。
厂商将产品封装在叫做名称空间的单元中,这样就可以用名称空间的名称来指出想使哪个厂商的产品。例:
Microflop::wanda("go dancing?");
Piscine::wanda("a fish named Desire?");
类、函数和变量便是C++编译器的标准组件,它们现在都被放置在名称空间std中。仅当头文件没有扩展名.h时,情况才是如此。
直接利用using namespace std;会使得std名称空间中都可用,但是在大型项目中是个潜在的问题。更好的方法是,只使所需的名称可用,这可以通过使用using声明来实现:
using std::cout;
using std::endl;
using std::cin;
2.1.6 使用cout进行C++输出
从概念上说,输出是一个流,即从程序流出的一系列字符。cout对象表示这种流,其属性是在iostream文件中定义的。cout的对象属性包括一个插入运算符(<<),它可以将其右侧的信息插入到流中。
1、控制符endl
cout<<endl; //重起一行,屏幕光标移到下一行开头
诸如endl等对于cout来说有特殊含义的特殊符号被称为控制符。
2、换行符
\n被视为一个字符,名为换行符。
cout<<"What's next?\n";
3、endl和\n的区别
endl和\n的主要区别在于前者会刷新缓冲区,而后者不会。如果需要在输出后立即刷新缓冲区,应该使用endl;否则,如果只需要简单地输出一个换行符,就可以使用\n。
缓冲区是指计算机用来临时存放数据的地方,通常是一块内存区域。在输入输出时,需要将输入或输出的数据先暂时存放在缓冲区中,然后根据一定条件一次性进行读写或写入。
在输入操作中,当用户输入数据时,这些数据首先被保存在输入缓冲区中,等待程序读取。在输出操作中,当程序向输出流写入数据时,这些数据并不会立即发送到目标设备,而是先被保存在输出缓冲区中,等待一定条件触发刷新缓冲区操作,将数据发送到目标设备。
缓冲区可以提高输入输出操作的效率,因为它可以减少对硬件设备的访问次数,同时还可以允许程序一次性处理多个数据项。但是如果缓冲区过小,就可能导致频繁的读写操作,影响效率;如果缓冲区过大,就会浪费内存资源。
2.1.7 C++源代码的格式化
在C++中,分号标示了语句的结尾,因此回车的作用就和空格或制表符相同。也就是说,通常可以在能够使用回车的地方使用空格。
必须遵守的规则就是,在C++中,不能把空格、制表符或回车放在元素(或名称)中间,也不能把回车放在字符串中间。
2.2 C++语句
2.2.1 声明语句和变量
要将信息项存储在计算机中,必须指出信息的存储位置和所需的内存空间。
int carrots;
//这条语句提供了两项信息:需要的内存以及该内存单元的名称。
在C++中,所有的变量都必须声明,声明通常指出了要存储的数据类型和程序对存储在这里的数据所使用的名称。
在其他软件中,所有的变量声明通常位于函数或过程的开始位置,但C++没有这种限制。实际上,C++通常的做法是,在首次使用变量前声明它。这样,就不必在程序中到处查找,以了解变量的类型。
2.2.2 赋值语句
利用赋值运算符=将值赋给存储单元。
2.2.3 cout的新花样
cout可以只能分辨出字符串25和整型数25。
C++插入运算符(<<)将根据其后的数据类型相应地调整其行为,这是一个运算符重载的例子。
2.3 其他C++语句
2.3.1 使用cin
cin>>carrots;
从这条语句中,信息从cin流向carrots。iostream文件将cin定义为一个表示这种流的对象。输出时,<<运算符将字符串插入到输出流中;输入时,cin使用>>运算符从输入流中抽取字符。通常,需要在运算符右侧提供一个变量,以接收抽取的信息(符号<<和>>被选择用来指示信息流的方向)。
与cout一样,cin也是一个智能对象。它可以将通过键盘输入的一系列字符(即输入)转换为接收信息的变量能够接受的形式。
2.3.2 使用cout进行拼接
以下两种方法都是可以的:
2.3.3 类简介
类是C++中面向对象编程(OOP)的核心概念之一。类是用户定义的一种数据类型。
2.4 函数
C++函数分为两种:有返回值的和没有返回值的。
2.4.1 使用有返回值的函数
有返回值的函数将生成一个值,而这个值可赋给变量或在其他表达式中使用。
例:
x=sqrt(6.25);
参数是发送给函数的信息,返回值则是从函数中发送回去的值。
在使用函数之前,C++编译器必须知道函数的参数类型和返回值类型。
原型只描述函数接口,它描述的是发送给函数的信息和返回的信息。而定义中包含了函数的代码,如计算平方根的代码。
2.4.2 函数变体
在C++中,函数调用中必须包括括号,即使没有参数。
2.4.3 用户定义的函数
可以通过函数名来调用用户定义的函数。对于库函数,在使用之前必须提供其原型,通常把原型放到main()定义之前,把函数的源代码放在main()后面。
#include <iostream>
void simon(int);
int main()
{
using namespace std;
simon(3);
cout << "Pick an integer:";
int count;
cin >> count;
simon(count);
cout << "Done!" << endl;
system("pause");
return 0;
}
void simon(int n)
{
using namespace std;
cout << "Simon says touch your toes " << n << " times." << endl;
}
1、函数格式
首先,有一个函数头;然后是花括号中的函数体。可以把函数的格式统一为如下情形:
type functionname(argumentlist)
{
statements
}
C++不允许将函数定义嵌套在另一个函数定义中,每个函数定义都是独立的。
2.4.5 在多函数程序中使用using编译指令
让程序能够访问名称空间std的方法有多种,下面是其中的4种:
-
将using namespace std; 放在函数定义之前,让文件中所有的函数都能够使用名称空间std中所有的元素。
-
将using namespace std; 放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素。
-
在特定的函数中使用类似using std::cout; 这样的编译指令,而不是using namespace std; ,让该函数能够使用指定的元素,如cout。
-
完全不使用编译指令using,而在需要使用名称空间std中的元素时,使用前缀std::,如下所示:
std::cout<<a<<std::endl;