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),是允许存在多个同名函数,而这些函数的参数表不同(或参数个数不同,或参数类型不同,或两种都不同)。重载和多态没有什么直接关系。
那么多态的作用是什么呢?
我们知道封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块;它们的目的都是为了代码重用。而多态则是为了实现另一个目的——接口重用!!
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),是允许存在多个同名函数,而这些函数的参数表不同(或参数个数不同,或参数类型不同,或两种都不同)。重载和多态没有什么直接关系。
那么多态的作用是什么呢?
我们知道封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块;它们的目的都是为了代码重用。而多态则是为了实现另一个目的——接口重用!!
相关文章推荐
- 【笔记】C++中一些易混淆的知识点
- 关于IO流操作中的一些容易混淆的知识点
- C++一些知识点的简单总结
- C++学习笔记2——易混淆概念及易忽略知识点
- C++的一些知识点汇总
- C++ 中一些零碎的知识点
- 收集的一些c++知识点与题目一
- c/c++的一些小知识点3
- C/C++ 一些知识点总结
- 【c++ 一些比较细节的知识点】函数指针
- 一些小的知识点(c++)
- C++之易混淆知识点三---算法分析
- C++之易混淆知识点四---虚函数与虚继承
- C++中不太注意的一些小知识点
- C++之易混淆知识点五
- c++知识点总结--new的一些用法
- c++的一些知识点
- C/C++中一些不太注意到的小知识点--[锦集]
- Js小知识及一些常见易混淆的知识点
- 一组JavaScript试题(包含一些容易混淆的知识点)