深入学习C++还必须掌握的基础

掌握形参带默认的函数

1.给默认值方向:从右向左给默认值;

2.调用效率:如果传默认值或者立即数(不需要从容器或内存取取的数字)的话都是直接将数字直接push进栈;没有mov汇编指令的操作;(面试回答要往汇编上描述)

3.默认值给的地方:定义和声明处均可以给默认值;

4.形参给默认值的时候,定义是可以多次定义这个函数的,都可以给默认值,声明的时候也可以给,但是每个参数的默认值只能出现一次;

掌握inline内联函数

函数调用开销:就是汇编生成的一系列指令,生成栈帧,对栈顶和栈底指针不断操作等,对于函数命令少,执行多次,函数调用开销大,不值得;

1.内联函数和普通函数的区别:①在编译的过程中没有函数调用开销(直接在函数调用点将函数代码展开)②函数也不再生成相应的函数符号(比如sum_int_int那些)③inline这个关键字只是建议编译器处理成内联函数,如果编译器发现是递归(需要知道自己调用自己多少次的)或者代码量大不适合内联等,不会设置成内联函数(可以通过查看符号表中有没有生成符号);④inline只有再release版本才出现,在debug版本上,inline是不起作用的,因为需要调试;(面试往原理上回答);

可以查看符号表的指令:

详解函数重载

1.C++为什么支持函数重载,而C不支持:

C++符号函数名取决于:函数名+参数列表, 而C符号函数名取决于:函数名;

2.函数重载需要注意:

①一组函数,函数名相同,参数列表个数或者类型不同,这组才能称为函数重载;仅仅返回值不同,必然不是重载;

②注意一组函数称得上重载,一定是在同一个作用域中;在函数调用点会寻找最近作用域去调用;

const或volatile的时候怎么影响形参类型:详细

3.C++和C语言之间如何相互调用:

①C++调用C:无法直接调用,因为两者产生的函数符号名不一样;

extern "C" {
int sum(int a, int b)//声明函数,说明这个函数是在C中声明的,用C的生成函数符号规则,去寻找;
}

②C调用C++:

extern "C" {
int sum(int a, int b) { //在c++里按照C规则去生成给C用
return a + b;
}
}

③通用方式的代码:

#ifdef _cplusplus //_cplusplus是c++内置的宏(简单替换),如果是C++编译器就会进入这个if和endif的代码,不是就不会进入;
extern "C" {
#endif
int sum(int a, int b) {
return a + b;
}
#ifdef _cplusplus //同理
}
#endif

多态问题:静态多态(编译时期):函数重载; 动态多态(运行时期):后面多态会讲到!

全面掌握const的用法

1.const理解

const修饰的变量不能再作为左值!初始化后不能再被修改;

2.C和C++中const的区别是什么

const的编译方式不同,C中const当作一个变量来编译生成指令;而C++中,所有const常量名字出现的地方,都被常量初始值替换了!!!

C:

C++:

如何用C++的const实现C的效果:

掌握const和一二级指针的结合应用1\2

1.const和一级指针的结合

const修饰的量(即常量)和 普通变量的区别:①编译方式不同(会编译期间替换);②不能作为左值(即不能再改变)

结合情况:

const和指针转换公式:

经典面试:

2.const和二级(多级)指针的结合

多级指针模型:

const和多级指针的类型转换:(可以采用相同/可推部分消除!)

上面写错,红色最后一句,q是普通指针,赋予存常量的地址,但是*q的类型指明b的值却是可以改的,违背了b的值不能变,所以不能这样转换

消除方法:

1)都转化为指针,两边都只带有*和const;2)看const是否不参与类型,能不能去掉const; 3)消除等式中相同或者可以推出的部分;4)依据规则看看是否可以类型转换;

练习:

掌握C++的左值引用和初识右值引用

引用和指针的区别:①从汇编层面回答,两者操作(定义改值等)都一样,将变量地址(不能将常量赋值给引用,因为常量没有地址)存在指针中,用值的时候将指针的地址拿出来然后解引用获取值;②引用是一种更加安全的指针,引用只有一级引用,指针有多级指针;③引用一开始就要赋值,且后面不能更改,指针没有这样的规则;

1.左值引用和右值引用

const、指针、引用的结合使用

const和引用的结合使用看上面;

指针和引用的结合可以将引用还原成指针再去思考问题(不然容易陷入对错中):

深入理解C++的new和delete

malloc和free是C的库函数; new和delete是C++运算符;

1.new和malloc的区别?delete和free的区别?

细看初识C++教程笔记

2.new有多少种?

深入C++02:深入学习C++还必须掌握的基础的更多相关文章

  1. 20145219 《Java程序设计》第02周学习总结

    20145219 <Java程序设计>第02周学习总结 教材学习内容总结 类型:基本类型.类类型(参考类型) 基本类型: 整数:short占2字节,int占4字节,long占8字节 字节: ...

  2. 学习ReactNative笔记整理一___JavaScript基础

    学习ReactNative笔记整理一___JavaScript基础 ★★★笔记时间- 2017-1-9 ★★★ 前言: 现在跨平台是一个趋势,这样可以减少开发和维护的成本.第一次看是看的ReactNa ...

  3. web前端学习python之第一章_基础语法(二)

    web前端学习python之第一章_基础语法(二) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  4. web前端学习python之第一章_基础语法(一)

    web前端学习python之第一章_基础语法(一) 前言:最近新做了一个管理系统,前端已经基本完成, 但是后端人手不足没人给我写接口,自力更生丰衣足食, 所以决定自学python自己给自己写接口哈哈哈 ...

  5. Ext JS 6学习文档-第3章-基础组件

    Ext JS 6学习文档-第3章-基础组件 基础组件 在本章中,你将学习到一些 Ext JS 基础组件的使用.同时我们会结合所学创建一个小项目.这一章我们将学习以下知识点: 熟悉基本的组件 – 按钮, ...

  6. ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现

    ASP.NET MVC 学习笔记-2.Razor语法   1.         表达式 表达式必须跟在“@”符号之后, 2.         代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...

  7. [源码解析] 深度学习分布式训练框架 Horovod (1) --- 基础知识

    [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 目录 [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 0x00 摘要 0x01 分布式并 ...

  8. Java学习-033-JavaWeb_002 -- 网页标记语言JSP基础知识

    JSP 是 Sun 公司提倡的一门网页技术标准.在 HTML 文件中,加入 Java 代码就构成了 JSP 网页,当 Web 服务器访问 JSP 请求的时候,首先执行其中的 Java 程序源码,然后以 ...

  9. Linux学习(2)- 正则表达式基础

    Linux学习(2)- 正则表达式基础 一.基础正则表达式介绍与练习 学习内容 正则表达式特殊符号 [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:] ...

随机推荐

  1. 《深入理解ES6》笔记——扩展对象的功能性(4)

    变量功能被加强了.函数功能被加强了,那么作为JavaScript中最普遍的对象,不加强对得起观众吗? 对象类别 在ES6中,对象分为下面几种叫法.(不需要知道概念) 1.普通对象 2.特异对象 3.标 ...

  2. JavaScript实现简单轮播图动画

    运行效果: 源代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&quo ...

  3. formData请求接口传递参数格式

    element ui组件方法的传递 //引入 组件. <el-upload class="avatar-uploader" :action="action" ...

  4. Pascal的旅行

    [问题描述] 一块的nxn游戏板上填充着整数,每个方格上为一个非负整数.目标是沿着从左上角到右下角的任何合法路径行进,方格中的整数决定离开该位置的距离有多大,所有步骤必须向右或向下.请注意,0是一个死 ...

  5. oracle 11g手工建数据库过程

    创建需求和目的 1.需要把11机器上的oracle库中的表导入到12机器oracle库 2.11机器上的数据库fp在12机器上不存在,需要创建新库,以便导入.3.我们只需导入业务库shp即可,不需要把 ...

  6. Python操作数据库类 Oracle、Sqlserver、PostgreSQL

    我在工作中经常使用Python,特点很明显,轻量,效率还不错,尤其在维护或者自动化方面. 下面是我使用到的访问数据库(Oracle.Sqlserver.PostgreSQL)的公共类. 一.Oracl ...

  7. Lumia1520 手机刷 Windows10 arm双系统

    注意问题 升级到Windows 10 Mobile 的需重新刷回WP8.1,否则解锁会失败 部分手机刷机win10arm后出现屏幕卡死现象,目前除了换屏或重新焊接暂无其他解决方案,请谨慎刷机(当然如果 ...

  8. SprigCloud入门踩坑之创建bean失败

    昨天也是报同样的错误,恰好要去吃饭,着急就没找到问题,把项目删了,后续看了路飞大佬的通过pom导入依赖的方式,但是资源导入太慢随放弃. 昨晚熄灯前二十分钟又从头敲了一遍,敲好就断电了,没来得及启动,今 ...

  9. 分布式应用运行时 Dapr 1.7 发布

    Dapr 是一个开源.可移植的.事件驱动的运行时,可以帮助开发人员构建在云和边缘上运行的弹性的.微服务的.无状态和有状态应用程序,并且关注于业务逻辑而不用考虑分布式相关的问题. 分布式相关的问题交给D ...

  10. 一键智能Mock,你值得拥有

    ​ 大家好呀,我是一名苦逼的前端开发工程师,为啥苦逼呢,这不,项目下周就要上线了,但是后端还没给我接口,没有接口我就无法调试,工作停滞不前,我也只能坐着干着急. 我报告给了我的老板山哥: 老板,这后端 ...