C++ Primer学习笔记之第六章--函数

6.1 函数基础

1、一个典型函数的定义包括以下部分
(1)返回类型(return type)
(2)函数的名字
(3)由0个或多个形参(parameter)组成的列表
(4)函数体

2、函数的调用完成两项工作
(1)一:用实参初始化函数对应的形参
(2)二:将控制权转移给被调用函数
(3)此时,主调函数(calling function)执行被暂时中断,被调函数(called function)开始执行。

3、return语句完成两项工作
(1)一:返回return语句中的值(如果有则返回)
(2)二:将控制权从被调函数转回主调函数

6.1 节练习
练习6.4:编写一个与用户交互的函数,要求用户输入一个数字,计算生成该数字的阶乘,在main函数中调用该函数。

#include
#include
#include
#include
#include
using std::invalid_argument;
using std::endl;
using std::string;
using std::cout;
using std::cin;
using std::vector;
void factorial();
int main(void){
    //6.1test -->6.4
    factorial();

    return 0;
}

void factorial()
{
    long int fac=1;
    long int n;
    cout<<"Enter the number: ";
    while(cin>>n)
    {
        try{
            if(n<=0)
                throw invalid_argument("Number must greater than 0!");
        }catch (invalid_argument){
            char c;
            cout<<"Enter the number again?(y/n): ";
            cin>>c;
            if(cin||c=='y')
            {
                factorial();
            }
            else if(!cin||c=='n')
                break;
        }

        for(;n>0;n--)
            fac=fac*n;
        cout<<"n!="<1;
        cout<<"Enter the number: ";
    }
}

练习6.5:编写一个函数输出其实参的绝对值:

#include
#include
#include
#include
#include
using std::invalid_argument;
using std::endl;
using std::string;
using std::cout;
using std::cin;
using std::vector;
void factorial();
void absolute();
int main(void){

    //6.1test -->6.5
    absolute();
    return 0;
}

void absolute()
{
    int n;
    cout<<"Enter a number,and output the absolute value: ";
    while(cin>>n)
    {
        if(n>0)
            cout<<"The absolute number is: "<else
            cout<<"The absolute number is: "<<-n<cout<<"Enter a number,and output the absolute value: ";     
    }
    cout<<"quit!"<

6.1.1 局部对象

1、在C++中,名字有作用于,对象有生命周期(life)。
(1)名字的作用于是程序文本的一部分,名字在其中可见。
(2)对象的生命周期是程序执行过程中该对象存在的一段时间。

2、函数体是一个语句块,块构成一个新的作用域,我们可以在其中定义变量。
(1)形参和函数体内部定义的变量,统称局部变量(local value)
(2)局部变量可隐藏(hide)外层作用域中同名的其他所有声明。

3、自动对象(auto object):只存在于块执行期间的对象。

4、局部静态对象(local static object):在程序的执行路径第一次经过对象定义语句时初始化,并且指导程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。
(1)用关键字static可定义局部静态对象。

6.1.1练习
练习6.7:编写一个函数,当它第一次被调用时返回0,以后每次调用返回值加1

#include
#include
#include
#include
using std::endl;
using std::string;
using std::cout;
using std::cin;
using std::vector;
int func_calledtimes();
int main(void){

    //6.1.1test -->6.7

    for(int i=0;i<10;++i)
        func_calledtimes();

    return 0;

}

int func_calledtimes()
{
    static int times=0;
    if(times==0)
    {
        cout<<"The function has been called "<" times."<return 0;
    }
    else
    {
        cout<<"The function has been called "<" times."<return times++;
    }

}

6.1.2 函数声明

1、函数的三要素:返回类型、函数名、形参类型描述了函数的接口,说明了该函数所需的全部信息。
(1)函数声明也称作为函数原型(function prototype)

2、含有函声明的头文件应该被包含到定义函数的源文件中。

6.1.3 分离式编译

1、大多数编译器提供了分离式编译每个文件的机制,这一过程通常会产生一个后缀名是.obj(Windows)或.o(Unix)的文件。

6.2 参数传递

1、形参初始化机制与变量初始化一样。

2、形参是引用类型时,我们说它对应的实参被引用传递(pass by reference)或函数被传引用调用(called by reference)。

3、当实参的值被拷贝给形参时,形参和实参是两个相互独立的对象。

6.2.1 传值参数

1、指针形参可改变实参的值。

2、使用引用避免拷贝
(1)拷贝较大类类型对象或容器比较低效
(2)甚至有的类类型(包括IO类型在内根本不支持拷贝操作)

3、如函数无须改变引用形参的值,最好将其声明为常量引用(const &)

6.2.1 节练习
练习6.10:编写一个函数,使用指针形参交换两个整数的值。

#include
#include
#include
#include
using 

你可能感兴趣的:(C++primer学习笔记,函数)