C++ 函数(Functions)

学习材料来自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;
}

运行结果如下:










评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值