从一个小程序说起
这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系。
问题探索
问题:对一个整型数组求和。
要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务。
赶紧的:大家一起动手!
参考:
#include <stdio.h> int addArray( int array[], int n ); int main() { int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int size = sizeof(data) / sizeof(data[0]); printf("结果是: %d\n", addArray( data, size )); return 0; } int addArray( int array[], int n ) { int sum = 0; int i; for( i=0; i < n; i++ ) { sum += array[i]; } return sum; }
深入一点思考
我们说数组和指针他们的关系很复杂。
在刚才的例子中,我们加点“料”试试~
然后我们还能得出第二个版本的程序:
1 #include <stdio.h> 2 3 int addArray( int *array, int n ); 4 5 int main() 6 { 7 int data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 8 int size = sizeof(data) / sizeof(data[0]); 9 10 printf("结果是: %d\n", addArray( data, size )); 11 12 return 0; 13 } 14 15 int addArray( int *array, int n ) 16 { 17 int sum = 0; 18 int i; 19 20 for( i=0; i < n; i++ ) 21 { 22 sum += *array++; 23 } 24 25 return sum; 26 }
轮到C++了
以上两个程序从本质上来说是相同的,我们得出结论:将函数的参数声明为数组和声明为指针是一样的。
现在我们来考虑一个新的问题:将该程序用C++来实现试试。
1 #include <iostream> // ostream C92 C99 2 3 // using namespace std; 4 5 int addArray( int *array, int n ); 6 7 int main() 8 { 9 int data[] = {0, 1, 2, 3, 4, 5,6, 7, 8, 9}; 10 int size = sizeof(data) / sizeof(data[0]); 11 12 std::cout << "½á¹ûÊÇ: " << addArray(data, size) << std::endl; 13 14 return 0; 15 } 16 17 int addArray( int *array, int n ) 18 { 19 int sum = 0; 20 int i; 21 22 for( i=0; i < n; i++ ) 23 { 24 sum += *array++; 25 } 26 27 return sum; 28 }
程序分析
这个小程序展示了C++对象的第一次使用。对象在哪里?就是这个”cout“。
cout 是一个输出流对象,它是”console out(控制台输出)“的缩写。是属于basic_ostream 类的对象。ostream 类在iostream头文件中定义。
什么是输出流?
其实也就是一个概念,在C++中引入了很多类似的概念:例如数据可以从键盘流入程序,又可以从程序流向屏幕、打印机等~
using namesapce std;
这条指定带给我们一个全新的概念:名字空间。
就是C++标准库所使用的所有标识符(即类、函数、对象等的名称)都是在同一个特殊的名字空间(std)中来定义的。
如果我们没有使用这条指令,我们将需要使用std::cout 这样的语法来调用输出流对象。
不知道大家有没有注意到“<<”这个符号很眼熟?
这个操作符不是C语言里边位运算的左移操作符吗?难道在C++里边改规则了?
事实上不是这样的,它只不过体现了C++的另一个特点:支持重载。重载事实上就是允许我们按照不同的方式使用同一个操作符。我们后边会详细讲解。