5.1 从C到C++
5.1.1 C++版框架
-
C++能编译大多数C语言程序。虽然C语言中大多数头文件在C++中仍然可以使用,但推荐的方法是在C头文件之前加一个小写的c字母,然后去掉.h后缀。例如stdio.h->cstdio.h,string.h->cstring,math.h->cmath,ctype.h->cctype.
-
C++用输入输出流iostream来解决输入输出问题,避免了C中各种输入输出格式问题,但是最大的缺点是运行太慢。可以通过关闭和stdio的同步,即调用ios::sync_with_stdio(false)来加速。
-
C++通过使用命名空间的问题来缓解复杂程序的组织问题。最常见的是使用using namespace std。例如,有两个不同的人甲和乙写的同一个函数fun()要整合到一个工程中,可以使用std1:fun()和std2:fun()来避免冲突,这和Java中使用全限定名来避免冲突是类似的。
-
C++中声明数组大小时,推荐用const int maxn = 100;这种形式来替代#define maxn 100这种形式。
-
C++的数据类型和C语言很接近,最显著的区别是多了一个bool来表示布尔值,然后用true和false分别表示真和假。
5.1.2 引用
C++提供了引用,虽然在功能上比指针弱,但是减少了出错的可能性,提高了代码的可读性。C++中的引用就是变量的“别名”,它可以在一定程度上代替C中的指针,可以在函数内直接修改实参。
5.1.3 字符串
C++提供了一个新的string类型,用来替代C语言中字符数组。C++在string头文件里定义了string类型,直接支持流式读写。string有很多方便的函数和运算符,但速度有些慢。
5.1.4 再谈结构体
C++中不再需要用typedef的方式定义一个struct,而且在struct里除了可以用变量(称为成员变量)之外还可以有函数(称为成员函数)。注意在工程上和算法竞赛中使用struct和class的区别,算法竞赛中一般用struct。
5.1.5 模板
虽然模板在工程中的应用范围很广,而且功能十分强大,但在算法竞赛中用的比较少。
5.1.6 番外篇 运算符重载
1.定义:
运算符重载的方法是定义一个重载运算符的函数,在需要执行被重载的运算符时,系统就自动调用该函数,以实现相应的运算。运算符重载的实质就是函数的重载。
2.格式:
函数类型 operator 运算符名称(形参列表)
{对运算符的重载处理}
注意:operator是关键字,operator 运算符名称是函数名称。
3.一般规则:
运算符重载函数既可以作为类的成员函数,也可以是类的友元函数,还可以是既非成员函数又非友元函数的普通函数(这种情况极少)。
一般而言,将单目运算符重载为成员函数,将双目运算符重载为友元函数。
特例:
对">>"和“<<”重载的函数形式如下:
istream & operator >>(istream &, 自定义类 &);
ostream & operator <<(ostream &,自定义类 &);
只能将重载">>"和"<<”的函数作为友元函数或普通的函数,而不能将它们定义为成员函数。
原因:
定义为成员函数第一个参数是隐含的this,而上面重载的函数中第一个参数是istream(ostream) &,不符合要求。
哈哈,最后一个问题:为什么要使用函数重载呢?
这样可以使得用户更为方便的使用,也方便程序员编写和调试。可以说是利己也利人。
至此,算法竞赛中有关C++的部分就已经基本上总结完了。
参考:C++面向对象程序设计,谭浩强