为什么要将成员函数的声明和定义分开
来源:互联网 发布:易语言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);
int _tmain(int argc, _TCHAR* argv[])
{
}
int func(int x)
{
}
输出:
请输入一个数字
1
输入的数字为:1
---------------------------------------------------------
分析:
在程序的第3行声明了一个内联函数func,它有一个整形变量int,并且返回一个整数。
在第10行则调用了这个函数
cout<<"输入的数字为:"<<func(x)<<endl;
在编译该程序时就会自动将上面第1行语句替换为第2行,因此在执行该程序时就会节省了一次跳转。
注意:在不知道具体怎么操作时,最好先不要使用内联函数,等完成程序的大部分功能时,再对符合要求的函数进行内联操作。
我们也可以将成员函数说明为内联函数,如:
using namespace std;
class A
{
public:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
}
void A::func(int x, int y){i=x;j=y;}//func定义部分
voidA::print(){cout<<"两数相乘为:"<<i*j<<endl;}//print定义部分
输出:
分析:
程序的第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:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
}
分析:
- 为什么要将成员函数的声明和定义分开
- 为什么将成员函数的声明和定义分开
- 为什么C++中声明和定义要分开写
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- 模板类成员函数的定义和声明为什么要放在一个文件中
- C++: 为什么我们一般都要将函数的声明和定义分开?(separate the declaration of function from its definition)
- IOS 将类的声明,类的定义,主函数分开放的代码。
- 为什么不能将类模板的声明与类模板函数实现分开写
- 为什么不能将类模板的声明与类模板函数实现分开写
- 为什么不能将类模板的声明与类模板函数实现分开写?
- 模板类和模板函数的声明和定义分开文件写的方法
- C++中,类和函数分开定义声明和实现的方法
- 模板函数的声明和定义为何不能分开放在两个文件中?
- 类声明和成员函数定义的分离示例
- 类声明和成员函数定义的分离
- 模板类成员函数的定义和声明
- 类声明和成员函数定义的分离
- Ubuntu下使用apt-get安装并使用VPN客户端
- 聊天应用中,如何在触摸tableView时收起键盘
- java中导入导出Excel表格(jxl)
- Spring+Quartz实现定时任务的配置方法
- 解析Json——操纵JsonArray
- 为什么要将成员函数的声明和定义分开
- 老师给我推荐的经典管理书籍
- java按流水号生成Log
- DB2 实例(instance)管理命令
- JavaScript判断变量是否为空
- Ubuntu Server下建立VPN服务器的方法
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
- java parseInt和valueof的区别
- javascript实现回车提交表单