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

虚幻大学 xuhss 145℃ 0评论

? 优质资源分享 ?

学习路线指引(点击解锁) 知识定位 人群定位
? Python实战微信订餐小程序 ? 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
?Python量化交易实战? 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

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

掌握形参带默认的函数

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

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

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

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

掌握inline内联函数

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

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

可以查看符号表的指令:

63bb704ab5dcc1641a968237aff1a343 - 深入C++02:深入学习C++还必须掌握的基础

详解函数重载

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

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

2.函数重载需要注意:

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

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

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

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

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

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

②C调用C++:

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

③通用方式的代码:

Copy#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:

69a496120478905c4b8adacf1695dc54 - 深入C++02:深入学习C++还必须掌握的基础

C++:

ff7c052d579896401b4ce2a893da0b04 - 深入C++02:深入学习C++还必须掌握的基础

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

98ec552a6c4dfae7c2f39fcef88acb87 - 深入C++02:深入学习C++还必须掌握的基础

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

1.const和一级指针的结合

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

结合情况:

e4c5480393697aa2bede18e3fd884897 - 深入C++02:深入学习C++还必须掌握的基础

const和指针转换公式:

9b475169523ce2d92a3d0840de1c2688 - 深入C++02:深入学习C++还必须掌握的基础

经典面试:f94ae28ec2a2ce41a15e34ad3aa65241 - 深入C++02:深入学习C++还必须掌握的基础

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

多级指针模型:

adbb94a86615a95f719c7b49aef6bb77 - 深入C++02:深入学习C++还必须掌握的基础

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7UBOS63M-1653671516379)(https://fastly.jsdelivr.net/gh/little-boy-David/blog-img/images202205272110483.png)]

e0d1d864f8300ac698479a2276a8b667 - 深入C++02:深入学习C++还必须掌握的基础

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

消除方法:

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

练习:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCD7cy2i-1653671516381)(https://fastly.jsdelivr.net/gh/little-boy-David/blog-img/images202205272146100.png)]

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

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

1.左值引用和右值引用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FyCZGQYg-1653671516382)(https://fastly.jsdelivr.net/gh/little-boy-David/blog-img/images202205272154558.png)]

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

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

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

3ed741143c77de46189cc5121262d84b - 深入C++02:深入学习C++还必须掌握的基础

深入理解C++的new和delete

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

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

细看初识C++教程笔记

2.new有多少种?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z5lbMnZW-1653671516384)(https://fastly.jsdelivr.net/gh/little-boy-David/blog-img/images202205272159629.png)]

转载请注明:xuhss » 深入C++02:深入学习C++还必须掌握的基础

喜欢 (0)

您必须 登录 才能发表评论!