C++所学的相关知识点整理(不定期更新)

来源:互联网 发布:地下城无限网络中断 编辑:程序博客网 时间:2024/05/22 07:44

1、C语言和C++的区别

C语言是面向过程的语言,结构为数据结构+算法,适合用于需求简单的科学计算。

C语言没有深思熟虑的思考过程,残留量过多,指针进行内存操作,目的是高效运行。

C++是面向对象的语言,结构为C语言+面向对象的方法论。由现实世界建立软件模型,构建的软件适应用户需求变化。


2、变量定义位置
C中,所有局部变量必须在函数开头定义;
C++中只要在使用之前定义好就可以;


3、C/C++中分配和释放内存的区别.

c: 
malloc/free,calloc,realloc均为函数 
指针名=(数据类型*)malloc(要申请的内存大小sizeof(type)) 
指针名=(数据类型*)calloc(n,类型大小sizeof(type)),分配n个大小为size的连续内存。 
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)
c++: 
new/delete 为运算符
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可以用于申请动态内存和释放内存。对于非内部数据类型对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于 
malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。


4、内存分配的形式有哪些

内存分配由三种方式:

一、从全局存储区域分配:这时内存在程序编译阶段就已经分配好,该内存在程序运行的整个周期都有效,如全局变量,static变量。

二、从栈区分配:在执行函数的时候,函数中的局部变量的存储单元都可以从栈中分配,函数执行结束后,这些存储单元都会被自动释放,实现从栈中分配存储单元运算操作内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

三、从堆中分配:也称为动态内存分配,在程序运行期间,可以使用malloc和new申请任意数量的内存单元,由程序员决定在什么时候使用free和delete释放内存。


5、函数重载和函数重写(覆盖)的区别

函数重载:

   函数重载指的是函数名相同、函数特征值不同的一些函数,这里函数的特征值指的是函数的参数的数目、参数类型和参数的排列顺序。当函数的参数数目、参数类型和参数的排列顺序都相同的时候就说明函数的特征值相同。

注:在函数重载的时候,仅仅函数的返回值不同是不行的,必须还包括函数的特征值不同才行,仅仅返回值的不同在调用函数的时候,程序依然不能分辨用户调用的是哪一个函数。

   当运用函数重载时,函数名都是相同的,但是函数的特征值必须至少有一项是不同的,运用重载函数我们不必在意参数的变量名,只需要关注上述的三个特征值即可。当运用此函数的时候,程序会自动进行参数匹配,然后调用特征值匹配正确的一个函数。

函数覆盖:

   函数的覆盖发生在父类与子类之间,其函数名、参数类型、返回值类型必须与父类中相对应被覆盖的函数严格一致,覆盖函数和被覆盖函数只有函数体不同,当派生类对象调用子类中该同名函数时会自动调用子类中的覆盖版本,而不是父类中的被覆盖的函数版本,这种机制就叫做函数覆盖。


6、内联函数(inline)

1)在C++中,在类的内部定义了函数体的函数,被默认为是内联函数,二不管是否由inline关键字;

2)如果函数的定义放在类的外面,函数定义前必须加inline才能成为内联函数,而函数声明可以加inline才能成为内联函数,而函数声明可以加inline也可以不加。

3)关键字inline必须与函数定义体放在一起才能是函数成为内联,仅将inline放在函数声明前不起任何作用。

所以说,inline是一种“英语实现的关键字”,而不是一种“用于声明的关键字”。一般说,用户可以阅读函数的声明,但是看不到函数的定义,尽管在大多书教科书中内联函数的声明和定义前都加了inline。


7、C++构造函数和析构函数的调用顺序

1)构造函数的调用顺序 

基类构造函数、对象成员构造函数、派生类本身的构造函数  

2)析构函数的调用顺序

派生类本身的析构函数、对象成员析构函数、基类析构函数(与构造顺序正好相反) 

3)特例 

局部对象,在退出程序块时析构

静态对象,在定义所在文件结束时析构

全局对象,在程序结束时析构 

继承对象,先析构派生类,再析构父类 

对象成员,先析构类对象,再析构对象成员

具体可参考:http://www.cnblogs.com/LubinLew/p/Cpp-CallOrderOfConstructorAndDeconstructor.html


8、C/C++中几个特殊关键字的作用及适用场合。

(1)extern关键字的作用?适用场合?使用注意事项?

extern可以置于变量或者函数之前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

(2)const关键字的作用?适用场合?使用注意事项?

1)在C语言中用const去修饰一个变量,标示这个变量是只读的,不可通过显式的调用a去修改a的值,并且此时a仍然时一个变量,不能等同于常量。

2)要注意const在声明变量时所处的位置,位置不同,在意义上可能会有很大的不同,如果const在‘*’左边,则表示指针指向的变量的值不可变;如果const在‘*’右边,则表示指针的值时不可变的。

3)C语言和C++的const'有很大的区别。在C语言中用const修饰的变量仍然是一个变量;而在C++中用const修饰后,就变成常量了。

 (3)voliate关键字的作用?适用场合?使用注意事项?

易变的‘因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据。当要求使可能发用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问;如果不适用volatile,则编译器将对所声明的语句进行优化。(简介的说,volatile关键子影响编译器的编译结果,用volatile声明的变量表示该变量随时发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

 (4)explict关键字的作用?适用场合?使用注意事项?

关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转化的发生。声明为explicit的构造函数不能在隐式转化中使用。