为什么要将成员函数的声明和定义分开

来源:互联网 发布:易语言qq盗号源码 编辑:程序博客网 时间:2024/04/28 13:53
 

为什么将成员函数的声明和定义分开,直接使用合并的成员函数岂不是更加简洁而又方便?如:

int print(){return weight;}

要说明这个问题,我们得先了解内联函数。

普通内联函数


当我们定义了一个函数,编译器就会在内存中为其创建一个指令集,当我们调用这个函数时,程序就会跳转到该指令集处。当该函数运行完毕后,程序又会返回到原来执行调用该函数语句的下一行继续执行。假如对该函数执行了上百次调用,那么就要来回跳转上百次,这会严重影响到程序的执行效率。

C++中,为解决这一问题,可以使用关键字inline声明函数。如:

inline int func();

则编译器将不会创建真正的函数,而是将这个内联函数的所有代码复制到调用函数中,这样程序在执行调用该函数时就不需要来回跳转,自然就提高了程序运行时的效率。

使用内联函数在提高效率时,会需多用一些代码,比如说程序调用了内联函数100次,那么就要将该内联函数中的代码复制100次,这样会增大程序的体积。

假如函数很小,那么即使多次复制也不会增加许多体积,这时使用内联函数比较合适。如: 

#include <iostream>
using namespace std;
inline int func(int); //使用inlie将带有一个int变量并返回int值的函数func说明为内联函数
int _tmain(int argc, _TCHAR* argv[])
{
 int x;
 cout<<"请输入一个数字\n";
 cin>>x; //将用户输入的数字保存在x变量中
 cout<<"\n";
 cout<<"输入的数字为:"<<func(x)<<endl;
 
 system("pause");
 return 0;
}
int func(int x)  //函数定义
{
 returnx;   //函数体
      

输出: 

请输入一个数字
1

输入的数字为:1

---------------------------------------------------------

分析:

在程序的第3行声明了一个内联函数func,它有一个整形变量int,并且返回一个整数。

在第10行则调用了这个函数

cout<<"输入的数字为:"<<func(x)<<endl;

该行语句等于:

cout<<"输入的数字为:"<<x<<endl;

在编译该程序时就会自动将上面第1行语句替换为第2行,因此在执行该程序时就会节省了一次跳转。

注意:在不知道具体怎么操作时,最好先不要使用内联函数,等完成程序的大部分功能时,再对符合要求的函数进行内联操作。


    成员内联函数

    

我们也可以将成员函数说明为内联函数,如:

#include<iostream>
using namespace std;
class A
{
public:
 inline voidfunc(int,int);//将成员函数func()声明为内联函数
 inline voidprint();    //将成员函数print()声明为内联函数
private:
 int i,j;
};
int _tmain(int argc, _TCHAR* argv[])
{
 A a;
 a.func(5,2);
 a.print();
 system("pause");
 return 0;
}
void A::func(int x, int y){i=x;j=y;}//func定义部分
voidA::print(){cout<<"两数相乘为:"<<i*j<<endl;}//print定义部分

输出:

两数相乘为:10


分析:

程序的第6-7行将类A的成员函数func和print声明为内联函数,第14-15行则调用了这两个函数。由于这两个函数是内联函数,因此在编译时,函数体中的代码都已分别写到了第14行和第15行。

我们也可以将成员函数的定义部分放到该类的声明中,也就是说将声明和定义合并在一起

如:

voidfunc(int x,int y){i=x;j=y;}

这样该函数就会自动成为内联函数。我们用该方法对上面的程序进行修改如下:

#include<iostream>
using namespace std;
class A
{
public:
 inline void func(int x,inty){i=x;j=y;}              //成员函数func()是内联函数
 inline voidprint(){cout<<"两数相乘为:"<<i*j<<endl;}   //成员函数print()是内联函数
private:
 int i,j;
};
int _tmain(int argc, _TCHAR* argv[])
{
 A a;
 a.func(5,2); //调用func(5,2)内联函数等于直接将i=5,j=2写在这里
 a.print();   //调用print()内联函数等于将{cout<<"两数相乘为:"<<i*j<<endl;}直接写到该行
 system("pause");
 return 0;
}

分析:

这就是声明与定义部分合并的成员函数与分开的成员函数之间的区别,合并后的成员函数是内联函数,等于将定义部分的代码直接复制到调用函数处。在函数体短小的情况下,利用这种方法可以有效地提高速度,但是假如函数体很多代码并且需要重复调用该函数,那么不断地复制该函数体的代码将会造成程序过大。

0 0