有趣的重载:
实验:
将1左移到cout对象中。
将Test改名为Console,此时我们的本意是想让这个cout代表当前的命令行:
cout代表命令行的一个实例,本意是想将1打印到命令行上。
我们在重载函数中用printf打印:
运行结果如下:
可以看到1被打印出来了。
我们还可以重载输出字符:
运行结果如下:
改进重载函数:
这样第24行就实现了连续的传送。
将换行符定义成一个常量:
最终完善的程序:
1 #include <stdio.h> 2 3 const char endl = ' '; 4 5 class Console 6 { 7 public: 8 Console& operator << (int i) 9 { 10 printf("%d", i); 11 12 return *this; 13 } 14 Console& operator << (char c) 15 { 16 printf("%c", c); 17 18 return *this; 19 } 20 Console& operator << (const char* s) 21 { 22 printf("%s", s); 23 24 return *this; 25 } 26 Console& operator << (double d) 27 { 28 printf("%f", d); 29 30 return *this; 31 } 32 }; 33 34 Console cout; 35 36 int main() 37 { 38 cout << 1 << endl; 39 cout << "D.T.Software" << endl; 40 41 double a = 0.1; 42 double b = 0.2; 43 44 cout << a + b << endl; 45 46 return 0; 47 }
运行结果如下:
重载过后我们就可以使用console实例来输出了,而不用每一次都输入格式化字符串了。
C++标准库:
重复发明轮子并不是一件有创造性的事,站在巨人的肩膀上解决问题会更加高效。
上述的输出流对象已经在C++标准库中实现了。
C++标准库有一个子库,这个子库涵盖了C库的功能。
C++编译环境的组成:
C语言兼容库和C++标准库中的C库子模块功能是重复的,但是它们所包含的头文件是不一样的。
标准库的常用数据结构:
最右边一列就是C语言子库。为了兼容C语言编译器的库中所提供的功能。
C++标准库中的C库兼容:
我们在上面程序中使用的 #include <stdio.h>就是C兼容库,而不是C语言库,C兼容库是由编译器厂商提供的,不是标准库的一部分。
例:
这里包含的头文件既不是C++标准库,也不是C语言库,它是C++编译器厂商为了推广自己的产品而提供出来的C兼容库。
我们将C兼容库换成C++标准库中的C兼容模块:
这时就得打开std命名空间了。
运行结果如下:
C++标准库:
前辈们将显示器和键盘实现成了C++中的对象。
C++中的输入输出:
1 #include <iostream> 2 #include <cmath> 3 4 using namespace std; 5 6 7 int main() 8 { 9 cout << "Hello world!" << endl; 10 11 double a = 0; 12 double b = 0; 13 14 cout << "Input a: "; 15 cin >> a; 16 17 cout << "Input b: "; 18 cin >> b; 19 20 double c = sqrt(a * a + b * b); 21 22 cout << "c = " << c << endl; 23 24 return 0; 25 }
运行结果如下:
小结: