学习材料来自MIT关于C++的课件
有的时候, 我们需要reuse 我们编写的代码, 这时, 一个好办法就是将我们的代码封装称为一个函数。
举个例子, 如何编写一个程序计算一个3的4次方。
Method1:
#include <iostream>
using namespace std;
int main() {
int threeExpFour = 1;
for (int i = 0; i < 4; i++) {
threeExpFour = threeExpFour * 3;
}
cout << " 3^4 is " << threeExpFour << endl;
return 0;
}
执行结果是:
Method2:
编写一个函数, 好处自不必说, 可以很好地重用, 利用这个函数能够计算出任意的指数:
#include <iostream>
using namespace std;
//function that computes an arbitrary integer to an arbitrary
//power
//sigature: int raiseToPower(int base, int exponent)
//function name: raiseToPower
//return type: int
// argument list: int base, int exponent
//{}之间是function body
int raiseToPower(int base, int exponent) {
int result = 1;
for (int i = 0; i < exponent; i++) {
result = result * base;
}
return result;//函数返回结果语句, 如果函数没有返回值,函数定义的返回类型就是void
}
int main() {
int threeExpFour = raiseToPower(3, 4);
cout << "3^4 is " << threeExpFour << endl;
int sixExpFive = raiseToPower(6, 5);
cout << "6^5 is " << sixExpFive;
return 0;
}
运行结果为:
下面说说容易让人糊涂的函数返回值Returning a Value
Up to(多达, 也就是有一个) one value may be returned, it must be the same type as the return type。
例如下面两个函数:
int foo() {
return "hello"; // error
}
char* foo() {
return "hello"; // ok
}
If no values are returned, give the function a "void " return type(注意不能申请一个void 的变量)。
int main() {
void x; // error
return 0;
}
注意return 语句并不一定放在函数的最后, 只要程序遇到reurn语句, 该函数就终止执行, 退出, 为了理解return语句,参看如下程序:
#include <iostream>
using namespace std;
void printNumberIfEven(int num) {
if (num % 2 == 1) {
cout << "odd number" << endl;
return; // 当然这里没有使用if-else 语句
}
cout << "even number, number is " << num << endl;
}
int main() {
int x = 4;
printNumberIfEven(x);
//even number; number is 4
int y = 5;
printNumberIfEven(y);
//odd number
return 0;
}
运行结果如下:
Function Overloading(函数重载)
所谓的函数重载, 就是函数名字相同, 但是函数的参数类型, 或者参数个数等至少有一个不相同。 重载机制很重要, 在C++ 中, 其实cin, cout 等, 就是重载的例子。 重载之后, 编译器会根据参数类型,或者参数个数 等自动的调用正确的函数。 下面我们简要介绍函数重载(overloading)。
重载例子一:
#include <iostream>
using namespace std;
//Function overloading
//overloading printOnNewLine function so that this function
//can print an integer and a string
void printOnNewLine(int x) {
cout << "Integer: " << x << endl;
}
void printOnNewLine(char* x) {
cout << "String: " << x << endl;
}
int main() {
printOnNewLine(3);
printOnNewLine("hello");
return 0;
}
运行结果如下:
Function overloading example2:
参数个数不同:
#include <iostream>
using namespace std;
//Function overloading
//overloading printOnNewLine function so that this function
//can print an integer and 2 integers
void printOnNewLine(int x) {
cout << "Integer: " << x << endl;
}
void printOnNewLine(int x, int y) {
cout << "2 integers: " << x << " and " << y << endl;
}
int main() {
printOnNewLine(3);
printOnNewLine(2, 3);
return 0;
}
运行结果为:
注意, 我们可以在调用之前首先定义好我们的函数, 如果我们打算在程序的最后再定义, 那么我们就必须要在调用函数以前对这函数进行声明。
例如下面的方式是错误的:
int foo() {
return bar()*2; // ERROR - bar hasn’t been declared yet
}
int bar() {
return 3;
}
解决办法有两种, 如下:
sol1:调整声明的顺序
int bar() {
return 3;
}
int foo() {
return bar()*2; // ok
}
sol2::使用函数原型, 告诉编译器你会在后面实现它:
int bar(); // function prototype
int foo() {
return bar()*2; // ok
}
int bar() {
return 3;
}
文件myLib.h
//myLib.h - header
//contains proptotypes
int square(int);
int cube(int);
myLib.h中原型的实现文件(implementation file)myLib.cpp如下:
//myLib.cpp
#include "myLib.h"
int cube(int x) {
return x * square(x);
}
int square(int x) {
return x * x;
}
我们的主程序为(main.cpp):
#include <iostream>
#include "myLib.h"
using namespace std;
int main() {
int x =3;
int y = square(x);
int z = cube(x);
cout << "squre of " << x << " is: " << y;
cout << "cube of " << x << " is: " << z;
return 0;
}
运行结果如下: