1, 成员函数和普通函数的所有区别
区别很大: 1.成员函数是面向对象的概念,所谓的成员函数,是指一个函数作为类的成员,公有成员、私有成员或者保护成员。 2.普通函数一般有两种传递方式,按类型传递和按值传递,也就是传指针和传返回值两种情况。成员函数一般是按类型传递,也即是传指针地址 3.普通函数可以随便调用,并且无法继承和封装,成员函数根据类的不同,可以进行继承,根据公有私有的不同,调用方式也不同 4.深层次的区别,普通函数作为C语言的概念,用的是stdlib,成员函数是用iostream,编译方法不同,至于谁占内存多,并不好说,也不是说面向对象的就占内存大些,还是看具体的环境和编译器。 5.嵌入式的编程,用普通函数较多,成员函数较少,当然ARM嵌入linux那种例外 大体上能一下子想到的只有这么多了函数是否分配内存,看变量,这个问题,我得详细解释一下,你是否熟悉汇编?知道不知道函数字段这个概念,也就说,所有函数都是分配在一段共享字段里面的,也就是你所说的内存,其实不仅仅是内存,包括闪存等等都可以包含,所以是占用了一段空间的,只是这段空间不一定在内存内,可能在闪存内,也可能在硬盘内,这么说,你清楚吗?
2, 内联函数与普通函数的区别是什么
内联函数是代码被插入到调用者代码处的函数。如同 #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;} }当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。
3, 虚函数和普通函数的区别
class Animal{public:virtual void Func1();};class Fish : public Animal{public:virtual void Func1();void Func2();};int main( int argc, char *argv[] ){Animal *an;Fish *fi;return 0;}-->; 第一类: 最简单的 an可以调用Func1(); fi可以调用Func1(); Fun1(); (用的都是自己的)-->; 第二类: 如果设置 an = fi; 结论是: an可以调用Func1(); fi可以调用Func1(); Func2();如上两种情况所说 其实给进行 an = fi; 其实没啥大用, 因为他们都调用了自己的函数;但是有一种情况我们是需要解决的 我们希望使用父类的指针来模拟子类的行为或者说 我们希望使用一根父类的指针 来调用我们在子类里"覆盖"了的函数那么我们需要使用 "虚函数"; 这样我们就可以使用一根父类的an指针 然后来模拟在子类中被 "override" 的函数 Func1();这就是多态, 在未引入"虚函数"之前 父类总会根据内存模型来调用父类的函数;引入了"虚函数"之后 父类就会(在运行时采用 "迟绑定")去检查 是否有子类override了父类的virtual函数;然后确定 调用的是哪一个函数 ( 子类的? 父类的? "子类优先" );"多态的实现":当编译器发现一个类中有虚函数时;就会为这个类自动生成一个"虚表" ; 该表是一个一维数组,在这个数组中存放每个虚函数的地址而且会生成一个"指向虚表指针"; 那么对于父类Animal有一个"虚表", 子类Fish由于一定有虚函数所以也有一个"虚表"现在在来结合上面的信息; "编译器按照an的内存结构来解释fi"; 这里就发生了"两个动作": ( an小fi大 才会截断 大给小 ok 小给大 GG )第一个是"内存的截断": 这就解释了为什么fi自己的函数 这里用不了了; 因为内存截断了,( 对于an, fi自己的子类部分成垃圾了 )第二个是"虚表指针改变": 一开始an的虚表指针应该指向着自己的虚函数, fi的虚表指针也指向了自己的虚函数;而此时an指向了fi子类对象 当按照an的内存结构解释fi时 解释到的是fi的"虚表"; 所以调用到了fi的虚函数;类里面的东西非常复杂 ....... 不是那么简单的判断而已
4, 静态函数和普通函数的区别
static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。静态函数C语言中使用静态函数的好处:静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。 关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
5, 指针与数组的区别和联系
区别:C语言把内存划分成四个区,它把一般的变量和数组等存在于内存中的栈区,所以数组在C语言的定义中只是一组同类型的普通变量,即使这个变量有可能是指针。所以他的作用比指针小的很多,而指针可以指向任何区的任何数据,所以就会觉得指针和数组名很像,但是必须要注意的是,数组名只是指针中的一种,它是指针中只指向栈区的且指针的移动范围是有限的,即数组长度。而且数组在定义之初就已经有了自己的内存,一般的指针如果未指向某一个内存块时,它是没有自己的内存的,即所谓的野指针。联系:如上面所说,数组只是定义在栈区的一个连续变量,它的首地址就是一个指针。总结:不仅数组有指针,所有变量都有指针,指针说白了就是内存中的地址,就像一个房间必须有一个房间号。在C/C++语言中定义一个指针,就是在栈区开辟一个内存空间用来存放它指向的内存地址,然后给指针赋值,就是把地址值赋值给刚才开辟的内存空间,然后通过访问该内存中的地址值来间接访问该地址下存放的数据。如果该地址值指向的是一块静态存储区,如字符串常量等,当然就不可以修改指向的内容啦。经验之谈,楼楼加分啊
相关概念
函数
函数的定义:给定一个数集A,假设其中的元素为x。现对A中的元素x施加对应法则f,记作f(x),得到另一数集B。假设B中的元素为y。则y与x之间的等量关系可以用y=f(x)表示。我们把这个关系式就叫函数关系式,简称函数。函数概念含有三个要素:定义域A、值域C和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。 函数(function),最早由中国清朝数学家李善兰翻译,出于其著作《代数学》。之所以这么翻译,他给出的原因是“凡此变数中函彼变数者,则此为彼之函数”,也即函数指一个量随着另一个量的变化而变化,或者说一个量中包含另一个量。函数的定义通常分为传统定义和近代定义,函数的两个定义本质是相同的,只是叙述概念的出发点不同,传统定义是从运动变化的观点出发,而近代定义是从集合、映射的观点出发。
静态
静态也可以理解为停止不动,不动的状态下就称为静态。从物理的角度讲就是静止状态,一个不动的状态。