闭关多日,整理一份C++中那些重要又容易忽视的细节

本文介绍了C++中的内联函数如何减少函数调用开销,名空间的作用与使用规则,引用的用法及其高效性,运算符重载的原理,以及虚基类中虚析构函数的必要性。同时提到了低代码趋势和学习资源的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++在编译的时候,会将每个函数编译成一条条机器语言指令,在执行常规函数时,程序将会跳转到相应的地址,将参数复制到堆栈,跳到标记函数起点的内存单元,执行函数代码,并在函数结束时返回。

这反复横跳并记录过程的过程,是要有一定的开销的。

内联函数则提供了另一种可能,对于内联函数,编译器在编译的时候直接在调用处将函数展开,嵌入到调用函数中,所以无需反复横跳,减少了时间的开销,但是,增加了空间的开销。

应有选择的使用内联函数,因为它节省下来的时间确实是少得可怜,如果说执行函数代码的时间比函数调用机制的时间长,那用内联函数就没什么意思。

所以才会产生这么一个说法:在某个短小精悍的函数被多次调用时,才考虑将其转为内联函数,苍蝇肉,实在小,不过聚沙成塔嘛。


头文件与名空间,好用吧!

名空间的支持是一项C++特性,旨在让我们比阿尼写大型程序以及将多个厂商的现有代码组合起来的程序时更容易。

注意:假设名空间和声明区域定义了相同的名称,试图使用声明将名空间的名称导入该声明区域,则两个名称会发生冲突,从而出错。如果使用using编译指令将该名空间的名称导入该声明区域,则局部版本将隐藏名空间版本。

一般说来,using声明(要用什么就声明什么)比使用using编译指令(using namespace XXX)更安全,这是由于它只导入指定的名称,如果该名称与局部名称发生冲突,那你还导入它干嘛?

没用过,下次可以试试自己写一个名空间,如果是没有名字的名空间,那么只能在包含那个名空间的文件里面使用该名空间内部的内容,类似于,静态变量、函数的集合。


引用


首先,&不是地址运算符,而是类型标识符的一部分,就像声明中的char*是指向char的指针一样,int&是指向int的引用。

示例:

int a;

int &b = a;

上述引用声明允许将a和b互换,因为它们指向相同的值和内存单元。

不过呢,必须在声明引用变量的时候进行初始化:

int a;

int &b;

b = a; //这样是不行的


返回引用的高效性

传统的返回机制是这样的:

1、获取返回值

2、将返回值复制到一个临时位置

3、调用函数从临时位置获取这个值

返回引用的返回机制是这样的:

1、获取返回值

2、直接将返回值拷贝给调用函数

如果返回值不大,那就不大,如果返回值是一个结构这种比较大的东西,那就比较麻烦了,能明白我意思不?

返回引用时,应避免返回函数终止时不再存在的内存单元引用(在指针里说过同样的话)。

为避免这种问题,最简单的方法就是:返回一个作为参数传递给函数的引用。


何时使用引用参数?

想用的时候呗。

使用引用参数这种“大招”的主要动机有:

1、程序员能够修改调用函数中的数据对象

2、可以提高程序的运行速度。

那么,什么时候该使用指针,什么时候该使用引用,什么时候该使用按值传递呢?

对象数据很小,按值传递即可。

对象是数组,指针。这是唯一的选择,并将指针声明为指向const的指针。

数据对象是较大的结构,使用const指针或const引用,提高程序效率。

数据对象是类对象,使用const引用。类设计的语义常常要求使用引用,因此,在传递类对象参数的标准方式是按引用传递。

对于修改调用函数中数据的函数:

如果数据对象是内置数据类型,使用指针。

如果对象是数组,只能使用指针。

如果对象是结构,使用指针或引用都可以。

如果对象是类对象,使用引用。



控制对成员的访问,是公有?是私有?

对新手来说,这个点估计是经常被忽略的吧。

数据项通常放在私有部分,组成类接口的成员函数放在公有部分。

为什么呢?这是C++的封装性。不然要类干什么?结构体不能用吗?

在后面讲设计模式的时候还会再细讲这一部分。


插点题外话

昨天我们老师给我们讲了意味深长的一段话。

现在你们年轻人不是很喜欢讲“内卷”嘛,然后用什么去对抗内卷,“躺平”嘛。

“用友”听说过吗?低代码听说过吗?

未来,这些前篇一律的基本代码,已经并不局限与本科生,专科生也可以做,甚至高中生都可以做。而某些本科生,还高人一等的姿态。

其实他讲低代码的时候,我想起来了QT的UI,只要你会拖控件,就可以做出界面来,代码可以后台自动生成。

而现在又有多少人,是面向百度编程的。

未来是低代码的时代,只会写低代码的人只会越来越卷,直到找不到工作。

所以不要把过多的时间花在那些低意义的学习上。

本科阶段,真正应该花时间去研究的,是算法,是操作系统,是数据库,是网络编程,是计网,是英语,等等这些东西。

不要以为你们是大数据专业的,真正有大数据的公司,会把数据给你吗?

这才是我心目中真正人间清醒的老师。

写给目前困惑的朋友,这篇的内容可能一周后你就不记得了,但是希望这段话对你有帮助吧。


运算符重载

C++允许将运算符重载扩展到用户定义的类型,重载运算符可以使代码看起来更自然。

要重载运算符,需要使用被称为运算符函数的特殊函数形式:

operator(argument-list)

下面的实例使用成员函数演示了运算符重载的概念:

#include

using namespace std;

class Box

{

public:

// 重载 + 运算符,用于把两个 Box 对象相加

Box operator+(const Box& b)

{

Box box;

box.length = this->length + b.length;

box.breadth = this->breadth + b.breadth;

box.height = this->height + b.height;

return box;

}

private:

double length; // 长度

double breadth; // 宽度

double height; // 高度

};

可重载运算符:

| 双目算术运算符 | + (加),-(减),*(乘),/(除),% (取模) |

| — | — |

| 关系运算符 | ==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于) |

| 逻辑运算符 | ||(逻辑或),&&(逻辑与),!(逻辑非) |

| 单目运算符 | + (正),-(负),*(指针),&(取地址) |

| 自增自减运算符 | ++(自增),–(自减) |

| 位运算符 | | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移) |

| 赋值运算符 | =, +=, -=, *=, /= , % = , &=, |

| 空间申请与释放 | new, delete, new[ ] , delete[] |

| 其他运算符 | ()(函数调用),->(成员访问),,(逗号),[](下标) |


面试题:C++类自动提供的成员函数

默认构造函数:如果没有定义构造函数

默认析构函数:如果没有定义

复制构造函数:、、、、

赋值运算符:、、、、

地址运算符:、、、、

当时面试的时候突然碰到这个问题,有感而发。


虚基类为什么需要虚析构函数?

直接来个示例看一下吧:

class test{

public:

virtual ~test() = 0; // 声明一个纯虚析构函数

};

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
会持续更新!**

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
[外链图片转存中…(img-cRcgTWR2-1713002653327)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值