您的位置:首页 > 编程语言 > C语言/C++

C/C++一些易混淆的知识点

2013-08-14 21:01 197 查看
                                            C/C++一些易混淆的知识点

1.     sizeof和strlen之间的区别:

1)      
sizeof是运算符,strlen是函数

2)      
sizeof可以用类型做参数,strlen只能用char*做参数,且必须是一“\0”结尾的。sizeof还可以用函数做参数,比如:short
f();     sizeof(f());//即sizeof(short)2

3)      
大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度。这就是sizeof可以用来定义数组维数的原因:

Char str[20]=”1234567890”;

Int a=strlen(str);//10它的内部实现是用一个循环计算字符串的长度直到“\0”为止

Int b=sizeof(str);//20

4)      
Strlen的结果要要在运行的时候才能计算出来,用来计算字符串的长度,而不是类型所占内存的大小。

5)      
当使用了一个结构类型或变量时,sizeof返回实际的大小。当使用一静态的空间数组时,sizeof返回全部数组的尺寸。Sizeof操作符不能返回被动态分配的数组或外部数组的尺寸。

6)      
数组做sizeof的参数不退化,传递给strlen就退化为指针。

7)      
数组作为参数传递给函数时传的是指针而不是数组,传递的是数组的首地址,如fun(char[8])  fun(char[])都等价于fun(char*)。

8)      
计算结构变量的大小就必须讨论数据对齐问题。C++在处理数据时经常把结构变量中的成员的大小安照4或8的倍数计算,这就叫做数据对齐。这样做可能会浪费一些内存,但在理论上CPU速度快了。

2.     内敛函数与宏的差别:

内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联可以直接被嵌到目标代码中。而宏只是一个简单的替换。宏替换是在编译前由预处理程序进行预处理,它只做简单的字符替换而不做语法检查。而内联函数是在编译时处理的,编译程序能识别内联函数,对它进行语法检查。

Inline是指嵌入代码,就是在调用函数的地方不是跳转,而是直接把代码写到那里去。对于短小的代码来说,inline可以带来一定的效率提升,可是是以增加空间消耗为代价的。

内联函数一般只用于如下情况:

1)      一个函数不断被重复调用

2)      函数只有简单几行,且函数内不包含for、while、switch语句。

一般来说,我们写小程序没有必要定义成inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline。

Inline函数是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处:

Inline fac(float i)  {return i*I;}  //没有写返回值

Printf(“b=%d”,fac(8));  //调用时就是执行Printf(“b=%d”,8*8);

3.     指针和引用的区别:

1)      
非空区别。任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。

2)      
合法性区别。在使用引用之前不需要测试它的合法性,相反,指针则应该总是被测试,防止其为空。

3)      
可修改区别。指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但指定对象其内容可以改变。

4)      
应用区别。总的来说,在一下情况下应该使用指针:一是考虑到存在不指向任何对象的可能(在这种情况下,能够设置指针为空),二是需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么应该使用引用。

4.       迷途指针:迷途指针也叫悬浮指针、失控指针,是当对一个指针进行delete操作后——这样会释放它所指向的内存——并没有把它设置为空时产生的。

5.       C++中有了malloc、free,为什么还需要new、delete?

Malloc和free是C/C++语言的标准库函数,new和delete是C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,只用malloc和free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc、free是库函数不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc、free。

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。New、delete是运算符,不是库函数。

6.       析构函数可以为virtual型,构造函数则不能。

 

虚函数采用一种虚调用的办法。虚调用时一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚。

7.       什么是多态?

多态性可以概括为“一个接口,多种方法”,在程序运行的过程中才决定调用的函数(晚绑定)。是通过虚函数实现的。

虚函数就是允许被其子类重新定义的成员函数。而子类重新定义父类虚函数的方法,称为“覆盖”(override)或者“重写”。而重载(overload),是允许存在多个同名函数,而这些函数的参数表不同(或参数个数不同,或参数类型不同,或两种都不同)。重载和多态没有什么直接关系。

那么多态的作用是什么呢?

我们知道封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块;它们的目的都是为了代码重用。而多态则是为了实现另一个目的——接口重用!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: