1, 内联函数无法再main函数中使用
内联函数没有办法通过类在外部调用,只能在类内部调用,因为内联函数的原理是在编译时直接替换调用地方的代码,例如int main() {test();}inline void test() {printf("test");}实际编译的代码就是:int main() {printf("test");}如果test是一个类的函数则编译的时候没有办法进行这样的替换。
2, 内联函数是什么?
定义:内联函数从源代码层看,有函数的结构,而在编译后,却不具备函数的性质。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。简介:“一个函数声明[。。。]说明符声明一个内联与内联函数。内联说明符指示的实现,内联函数体替代了在调用点是首选通常的函数调用机制。一个实现不要求在调用执行此点内联替代,但是,即使这个内嵌替代省略,由7.1.2内联函数定义的其他规则,仍应得到尊重“。注意事项:内联函数具有一般函数的特性,它与一般函数所不同之处只在于函数调用的处理。一般函数进行调用时,要将程序执行权转到被调用函数中,然后再返回到调用它的函数中;而内联函数在调用时,是将调用表达式用内联函数体来替换。在使用内联函数时,应注意如下几点: 1. 在内联函数内不允许用循环语句和开关语句。 如果内联函数有这些语句,则编译将该函数视同普通函数那样产生函数调用代码,递归函数(自己调用自己的函数)是不能被用来做内联函数的。内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。 2. 内联函数的定义必须出现在内联函数第一次被调用之前。 3. 本栏目讲到的类结构中所有在类说明内部定义的函数是内联函数。
3, [转载]为什么内联函数,构造函数,静态成员函数不能为
内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数2 构造函数构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数3 静态成员函数静态成员函数属于一个类而非某一对象,没有this指针,它无法进行对象的判别这个可以从两个角度去理解:1。virtual意味着在执行时期进行绑定,所以在编译时刻需确定信息的不能为virtual构造函数需在编译时刻,因为需构造出个对象,才能执行动作,静态成员函数不属于任何一个对象,编译时刻确定不存在执行的时候选择执行哪个的情形内联函数,由于属于编译器的建议机制,所以可以virtual2。virtual意味着派生类可以改写其动作派生类的构造函数会先执行基类的构造函数而不是代基类构造函数,也就是说基类的构造函数可以看作派生类构造函数的组成,所以并不能改写这个函数静态成员函数不属于任何一个对象,所以更不能改写其动作了inline和virtual不会同时起作用。带virtual的函数在不需要动态绑定调用的时候,就可以inline。虚构造函数(virtualconstructor)C++不支持直接的虚构造函数。虚拟机制的设计目的是使程序员在不完全了解细节(比如只知该类实现了某个界面,而不知该类确切是什么东东)的情况下也能使用对象。但是,要建立一个对象,可不能只知道“这大体上是什么”就完事——你必须完全了解全部细节,清楚地知道你要建立的对象是究竟什么。所以,构造函数当然不能是虚的了。但是,可通过虚函数virtual clone()(对于拷贝构造函数)或虚函数 virtualcreate()(对于默认构造函数),得到虚构造函数产生的效果。注意:子类成员函数clone()的返回值类型故意与父类成员函数clone()的不同。这种特征被称为“协变的返回类型”(CovariantReturn Types),该特征最初并不是C++语言的一部分,VC6.0以下版本编译器不支持这样的写法。虚析构函数(virtualdestructor)当你可能通过基类指针删除派生类对象时,建议使用虚析构函数。虚函数绑定到对象的类的代码,而不是指针/引用的类。如果基类有虚析构函数,deletebasePtr(基类指针)时,*basePtr 的对象类型的析构函数被调用,而不是该指针的类型的析构函数。
相关概念
函数
函数的定义:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示。我们把这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。
调用
调用是将程序的执行交给其他的代码段,通常是一个子例程,同时保存必要的信息,从而使被调用段执行完毕后返回到调用点继续执行。