C/C++一些易混淆的知识点
来源:互联网 发布:大数据营销 市场规模 编辑:程序博客网 时间:2024/06/04 23:35
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),是允许存在多个同名函数,而这些函数的参数表不同(或参数个数不同,或参数类型不同,或两种都不同)。重载和多态没有什么直接关系。
那么多态的作用是什么呢?
我们知道封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块;它们的目的都是为了代码重用。而多态则是为了实现另一个目的——接口重用!!
- C/C++一些易混淆的知识点
- C/C++容易混淆的小知识点
- [c语言基础回顾]操作符和表达式中一些极其容易混淆的知识点
- C语言的一些知识点
- C语言的一些知识点
- 初学c/c++出现的一些易混淆概念
- C语言中的几个容易混淆的知识点总结
- C语言中的几个容易混淆的知识点总结
- C语言指针与数组易混淆知识点(一)
- 一些c/c++知识点
- C语言一些知识点
- 【笔记】C++中一些易混淆的知识点
- java集合中的一些易混淆的知识点
- C语言的一些偏僻知识点
- 非常有用的一些objective-c知识点
- 非常有用的一些objective-c知识点
- 非常有用的一些objective-c知识点
- 非常有用的一些objective-c知识点
- OpenStack Swift client开发
- firefly框架分析之netconnect package(一)
- N皇后问题(hdu2553,dfs+打表)
- DataGridView显示数据
- Python 输出货币格式数据
- C/C++一些易混淆的知识点
- hdu 1564 博弈
- 对 Linux 专家非常有用的 20 个命令
- 软件开发人员的内功修炼之道
- javah生成头文件问题
- C/C++调用matlab程序
- android:shape的使用
- 如何做一名优秀的程序员
- MySQL 6.0 Windows下安装图解