欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > 构造函数是内联函数吗 [转载]为什么内联函数,构造函数,静态成员函数不能为
构造函数是内联函数吗 [转载]为什么内联函数,构造函数,静态成员函数不能为
2019-07-24 20:23:49 来源:朵拉利品网

1, [转载]为什么内联函数,构造函数,静态成员函数不能为



内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数2 构造函数
构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数
3 静态成员函数
静态成员函数属于一个类而非某一对象,没有this指针,它无法进行对象的判别
这个可以从两个角度去理解:
1。virtual意味着在执行时期进行绑定,所以在编译时刻需确定信息的不能为virtual
构造函数需在编译时刻,因为需构造出个对象,才能执行动作,
静态成员函数不属于任何一个对象,编译时刻确定不存在执行的时候选择执行哪个的情形
内联函数,由于属于编译器的建议机制,所以可以virtual
2。virtual意味着派生类可以改写其动作
派生类的构造函数会先执行基类的构造函数而不是代基类构造函数,也就是说基类的构造函数可以看作派生类构造函数的组成,所以并不能改写这个函数
静态成员函数不属于任何一个对象,所以更不能改写其动作了
inline和virtual不会同时起作用。
带virtual的函数在不需要动态绑定调用的时候,就可以inline。
虚构造函数(virtual
constructor)C++不支持直接的虚构造函数。虚拟机制的设计目的是使程序员在不完全了解细节(比如只知该类实现了某个界面,而不知该类确切是什么东东)的情况下也能使用对象。但是,要建立一个对象,可不能只知道“这大体上是什么”就完事——你必须完全了解全部细节,清楚地知道你要建立的对象是究竟什么。所以,构造函数当然不能是虚的了。
但是,可通过虚函数
virtual clone()(对于拷贝构造函数)或虚函数 virtual
create()(对于默认构造函数),得到虚构造函数产生的效果。
注意:子类成员函数clone()的返回值类型故意与父类成员函数clone()的不同。这种特征被称为“协变的返回类型”(Covariant
Return Types),该特征最初并不是C++语言的一部分,VC6.0以下版本编译器不支持这样的写法。
虚析构函数(virtual
destructor)
当你可能通过基类指针删除派生类对象时,建议使用虚析构函数。虚函数绑定到对象的类的代码,而不是指针/引用的类。如果基类有虚析构函数,delete
basePtr(基类指针)时,*basePtr 的对象类型的析构函数被调用,而不是该指针的类型的析构函数。

3, 内联函数与普通函数的区别是什么



内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。
内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。
声明内联函数看上去和普通函数非常相似:
void f(int i, char c);
当你定义一个内联函数时,在函数定义前加上 inline 关键字,并且将定义放入头文件:
inline void f(int i, char c) { // ... }
任何在类的说明部分定义的函数都会被自动的认为是内联函数。
内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。
Inline tablefunction(int I) {return I*I};
这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。
我们也可以将定义在类的外部的函数定义为内联函数,比如:
Class TableClass{ Private: Int I,j; Public: Int add() { return I+j;}; Inline int dec() { return I-j;} Int GetNum(); } inline int tableclass::GetNum(){ return I; }
上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。
内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。
Class sample{ Private: Int nTest; Public: Int readtest(){ return nTest;} Void settest(int I) {nTest=I;} }
当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

相关概念


函数

函数的定义:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示。我们把这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。

定义

定义,是一个汉语词语,意思是对于一种事物的本质特征或一个概念的内涵和外延的确切而简要的说明。