当前位置:首页 > 嵌入式 > 嵌入式客栈
[导读]默认参数你会用么?

[导读] 在开发比较大型的C 项目的时候,这样一些场景你或许会遇到:1.维护别人写的代码;2.老板要你在加个功能;3.项目需要持续发布,功能在不断添加;等等,很多时候,我们可能需要对一些类原有函数增加参数。此时,你很容易就能想到的办法就是重载一下,或者修改原函数。本文就来分享一下在实际开发中的切身体验。

直接改原函数

比如这样的简单栗子(栗子仅为说明思路):
class point{
public:
point(double x,double y);
~point();
draw();
private:
double x;
double y;
};
其中的draw方法在其最初的版本时,就是简单的将(x,y)坐标处绘制一个点,至于这个点长啥样不管。可是忽然有一天,讨厌的光头产品经理跑过来说,这点黑漆麻咖的,太特么难看了!他想给这个点上点色。但是有的地方呢,他又觉得黑漆漆的还蛮好看。于是乎,就把draw改成这样了:
//假定用一个32bit 16进制值来表示RGB。
draw(unsigned int color);
完了,一看代码,发现只有很少几个地方需要特定的颜色显示,大部分默认就好了,可是原来函数已经变了啊,没办法我只能吭呲吭呲的把所有调用的地方都改一遍,泥马,好都地方要改呀~
改着改着,一想C 这么牛逼的语言,一定还有其他的方案来应对类似的场景。一拍脑门,想起来,可以重载个函数嘛。
于是乎.......

重载draw

这么一想,原类就变成这样了:
class point{
public:
point(double x,double y);
~point();
draw();
draw(unsigned int color);
private:
double x;
double y;
};
哇,很爽!就几个调用的地方需要替换,啪啪一顿替换,提交上线,完事。端起杯子喝水,一边看着自己的代码,还有没有其他的办法呢?
重载虽然爽,但是功能如果不断迭代,重载原来越多,大部分修改都很小的改动,可是类却变的越来越胖了!而且重载的代码里大部分内容与原函数基本一致,仅仅添加了一个颜色指定!心里隐隐觉得好似这样整也不是很爽。突然间,脑瓜里想起好像C 可以支持默认参数这一说。于是乎,又一顿敲.....

修改原函数

又继续回到老路上,把原来的类一顿改,变成这个鸟样:
#define DEFAULT_COLOR  (0x00FFFFFF)
class point{
public:
point(double x,double y);
~point();
draw(unsigned int color=DEFAULT_COLOR);
private:
double x;
double y;
};
好嘛,就几个地方需要改,就把对应的地方替换一下:
pt.draw(0xxxxxx);
//其他地方,啥也不用改
pt.draw();
0xxxxxx为光头产品经理想要的颜色,其他的需要显示原颜色的很多地方不动,编译运行,效果一样!想着这下可以了。那么什么是C 的默认参数呢?

何为函数默认参数?

C 函数默认参数,是指函数声明中提供的值,如果函数的调用者未提供带有默认值的参数值,则该值由编译器自动分配
我不清楚C 的设计者设计默认参数是否是出于这样的应用场景考虑,但是个人认为默认参数确实在本文类似的场景中表现的比重载更为优雅。让类不会因为不断迭代变的因为一些简单没必要增加重载函数的时候大显身手。
那么使用默认参数,需要注意些什么呢?
  • 默认参数不同于常量参数,因为常量参数不能更改,而默认参数可以根据需要覆盖。
  • 调用函数为其提供值时,默认参数将被覆盖。如果调用者不给定参数,编译器将声明中的默认值传入调用的地方。
  • 将默认值用于函数定义中的参数后,在相同作用域中该参数的所有后续参数都必须具有默认值。也可以说默认参数是从右到左分配的。例如,以下函数定义无效,因为默认变量z的后续参数不是默认变量。
int sum(int x, int y, int z=0, int w)
什么是相同作用域呢?比如这样也是可以的:
{
void f(int n, int k = 1);
void f(int n = 0, int k); // OK: k的默认值在前一个函数的声明中指定了
}
  • 默认参数是在函数声明中指定的,因此在函数体实现的地方就不能还带着默认值,这样编译会报错!比如
point::draw(unsigned int color=DEFAULT_COLOR)
{
......
}
  • 虚拟函数的重载不会从基类声明中获取默认参数,并且在调用虚拟函数时,将根据对象的静态类型来确定默认参数。
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭