C++易混淆概念
1. 引用和指针有什么区别?
本质:一个是别名,一个是地址
1. 指针可以在运行时改变其所指向的值,引用一旦和某个对象绑定就不再改变
2. 引用没有const, 指针有const
3. 从内存上看,指针会分配内存区域,引用不会,它仅仅是一个别名
4. 在参数传递时,引用会做类型检查,而指针不会
5. 引用不能为空,指针可以为空
【类型检查、const、内存、值、空】
2. const和define有什么区别?
本质:define只是字符串替换,const参与编译运行。
1. define不会做类型检查,const拥有类型,会执行相应的类型检查
2. define仅仅是宏替换,不占用内存,而const会占用内存
3. const内存效率更高,编译器通常将const变量保存在符号表中,而不会分配存储空间,这使得它成为一个编译期间的常量,没有存储和读取的操作
3. define和inline有什么区别?
本质:define只是字符串替换,inline由编译器控制
• define只是简单的宏替换,通常会产生二义性;而inline会真正地编译到代码中
• inline函数是否展开由编译器决定,有时候当函数太大时,编译器可能选择不展开相应的函数
4. malloc和new有什么区别?(malloc/free和new/delete)
本质:malloc/free 是C语言的库函数,new/delete是C++的操作符
malloc仅仅用来分配内存,而不会执行相应的构造函数,函数返回值为void*;而new会调用相应的构造函数,返回值的是相应对象类型的指针
(new内部是调用malloc的,new相当于malloc和构造函数的一个结合体。)
follow up:有了malloc/free为什么还要new/delete?
对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器的控制范围之内,不能把执行构造函数和析构函数的任务强加于malloc/free.
5. C++中static关键字作用有哪些?
1. 扩展生存周期(如局部static变量)
2. 限制作用域:用于全局变量。与普通全局变量不同的是,它表明该变量的作用域仅限于当前cpp文件,因此当其他cpp文件中同样出现同名的static变量时,他们是不同的独立的变量。
follow up:
1) 成员函数能否同时修饰为static和const的呢?
不能。
static成员函数:由类的所有对象共有,以类为单位。
const函数:表示不会修改对象的成员变量。是以对象为单位。
static函数是从类的角度,const函数是从对象的角度。一个函数要么是类的,要么是对象的,不可能同时满足。
(以上都是针对成员函数来说。成员变量的话是可以同时用的。)
2) static函数能否调用非static函数呢?
不能。类似上一题。
static是以类为单位,非static修改的对象的成员变量。它们不是一个层次的。
6. C++中const关键字作用有哪些?
1.) 修饰变量
指向const变量的指针:(const在*左边。指针所指的内容不能被修改)
const int* ptr;
int const* ptr;
const指针:(const在*右边。指针本身不能被修改)
int* const ptr;
2.) 修饰成员函数,表示该成员函数不会修改成员变量
7. const变量真的不能被修改吗?
可以通过指针修改。如,
const int a = ;
int* ptr = NULL;
ptr = (int*)(&a);
*ptr = ;
详见NCH slide。
8. C++中包含哪几种强制类型转换?他们有什么区别和联系?
Use dynamic_cast for converting pointers/references within an inheritance hierarchy.
Use static_cast for ordinary type conversions.
Use reinterpret_cast for low-level reinterpreting of bit patterns. Use with extreme caution.
Use const_cast for casting away const/volatile. Avoid this unless you are stuck using a const-incorrect API.
9.
STL共有六大组件
1、容器。2、算法。3、迭代器。4、仿函数。6、适配器。
仿函数(functor),就是使一个类的使用看上去象一个函数。其实现就是类中实现一个operator()。【本质是一个类】
10. 面向对象的特性:封装、继承、多态
11. 重载、覆盖和隐藏的区别
首先,重载、覆盖和隐藏都是针对两个同名函数而言的。
重载必须是同一个类中的两个同名函数,参数不同。
覆盖和隐藏都是针对的派生类和基类而言。
如果派生类的函数与基类的函数同名,但是参数不同,此时,不论是否是虚函数,基类的该函数将被隐藏。
如果派生类的函数与基类的函数同名,并且参数相同,如果基类的该函数不是虚函数,则基类的该函数被隐藏;如果基类的该函数是虚函数,则基类的该函数被覆盖。(覆盖只针对虚函数而言)
调用时:
重载:看参数。
覆盖:看指针实际指向的对象(即虚函数调用规则)。
隐藏:看指针类型。
ref: http://www.cnblogs.com/txwsh1/archive/2008/06/28/1231751.html 【总结的很全面。从上到下把例子都看看就明白了】
C++易混淆概念的更多相关文章
- C#中一些易混淆概念总结
C#中一些易混淆概念 这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框 ...
- 【C#小知识】C#中一些易混淆概念总结(七)---------解析抽象类,抽象方法
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...
- 【C#小知识】C#中一些易混淆概念总结(六)---------解析里氏替换原则,虚方法 分类: C# 2014-02-08 01:53 1826人阅读 评论(0) 收藏
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...
- 【C#小知识】C#中一些易混淆概念总结(五)---------继承 分类: C# 2014-02-06 22:05 1106人阅读 评论(0) 收藏
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...
- 【C#小知识】C#中一些易混淆概念总结(五)---------深入解析C#继承
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 [C#小知识]C#中一些易混淆概念总结(二)--------构造函数,this关键字 ...
- 【C#小知识】C#中一些易混淆概念总结(四)---------解析Console.WriteLine() 分类: C# 2014-02-05 17:18 1060人阅读 评论(0) 收藏
目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) [C#小知识]C#中一些易混淆概念总结(三) ------------------------------ ...
- 【C#小知识】C#中一些易混淆概念总结(三)---------结构,GC,静态成员,静态类
目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) ---------------------------------------分割线----------- ...
- 【C#小知识】C#中一些易混淆概念总结(二)--------构造函数,this关键字,部分类,枚举 分类: C# 2014-02-03 01:24 1576人阅读 评论(0) 收藏
目录: [C#小知识]C#中一些易混淆概念总结--------数据类型存储位置,方法调用,out和ref参数的使用 继上篇对一些C#概念问题进行细节的剖析以后,收获颇多.以前,读书的时候,一句话一掠而 ...
- 【C#小知识】C#中一些易混淆概念总结---------数据类型存储,方法调用,out和ref参数的使用
这几天一直在复习C#基础知识,过程中也发现了自己以前理解不清楚和混淆的概念.现在给大家分享出来我的笔记: 一,.NET平台的重要组成部分都是有哪些 1)FCL (所谓的.NET框架类库) 这些类是微软 ...
- JavaScript 进阶(五)易混淆概念null vs undefined, == vs ===, string vs String
先看一段代码 var foo = {} foo.a = null alert(foo.a == null) //true alert(foo.a === undefined) //false ...
随机推荐
- C/C++ -- Gui编程 -- Qt库的使用 -- 标准对话框
-----mywidget.cpp----- #include "mywidget.h" #include "ui_mywidget.h" #include & ...
- 用as3.0制作一个滚动条组件
本实例演示了实现一个滚动条基本功能的制作方法,没有添加改变皮肤,修改滚动条视框大小等功能,有兴趣的朋友可根据自己要求自行添加.使用时只需要通过以下一行代码创建滚动条组件: var myScrollba ...
- Spring+Druid+SpringMVC的搭建(附Demo)
最近公司事情比较少,便想利用这段空闲时间做一个自己的博客. 前端界面已经搞好,感谢杨姐的模板,自己稍微把模板没有的模块给补全了. 今天便开始自己的SSM框架搭建,数据库链接是采用数据库连接池.先上个项 ...
- 在Pycharm中使用AutoPEP8来检验代码的规范性
在学习python的过程中,我们经常会遇到代码不规范而导致的程序报错,代码的规范和严谨就显得尤为重要了,所以编写代码的过程中,我们需要遵循PE8规范,在Pycharm 中我们可以安装插件 AutoPE ...
- centos7 Mariadb5.5升级到Mariadb10.2
一次升级过程,在此记录下. 原因:新的项目需要新的数据库版本支持. 升级主要步骤: 备份原数据库 --->卸载mariadb --->添加mariadb国内yum源 --->安装ma ...
- RabbitMQ上手记录–part 5-节点集群高可用(多服务器)
上一part<RabbitMQ上手记录–part 4-节点集群(单机多节点)>中介绍了RabbitMQ集群的一些概念以及实现了在单机上运行多个节点,并且将多个节点组成一个集群. 通常情况下 ...
- mariadb(mysql)从库relaylog损坏无法同步的处理方法
故障说明 晚上备用服务器自动重启,收到报警,备用服务器上的mariadb从库无法去同步主库.启动mariadb后,报如下错误(重点看红色字体) mariadb_1 | -- :: [Note] Pl ...
- (译) 在AngularJS中使用的表单验证功能
验证功能是AngularJS里面最酷炫的功能之一,它可以让你写出一个具有良好用户体验的Web应用. 在AngularJS中,有许多用于验证的指令.我们将先学习几个最流行的内置指令,然后再创建一个自定义 ...
- 键盘输入,输出int数组的函数
public class function { public static void main(String[] args) { //输入数组数据(例如10个) int [] array = inPu ...
- Storm框架:如何消费RabbitMq消息(代码案例)
1.定义拓扑topology public class MessageTopology { public static void main(String[] args) throws Exceptio ...