news 2026/3/26 21:00:53

C++函数进阶:默认参数与函数重载,让你的代码更智能!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++函数进阶:默认参数与函数重载,让你的代码更智能!

C++函数进阶:默认参数与函数重载,让你的代码更智能!

大家好!今天我们来聊聊C++中两个非常实用的特性:默认参数函数重载。这两个特性能让我们的代码更灵活、更简洁,提高开发效率。

一、默认参数:让你的函数调用更智能

什么是默认参数?

默认参数就是当函数调用时省略了某些实参,编译器会自动使用的预设值。这就像给函数设置了一个“智能默认值”。

如何使用默认参数?

默认参数必须在函数原型中指定:

// 设置默认参数char*left(constchar*str,intn=1);// n的默认值为1

这样调用:

  • left("theory", 3)→ 返回前3个字符"the"
  • left("theory")→ 返回前1个字符"t"(使用默认值)

重要规则:

  1. 必须从右向左设置默认值

    // 正确:从右向左intharpo(intn,intm=4,intj=5);// 错误:不能跳过参数intchico(intn,intm=6,intj);// j没有默认值!
  2. 调用时不能跳过参数

    harpo(2);// ✓ n=2, m=4, j=5harpo(1,8);// ✓ n=1, m=8, j=5harpo(8,7,6);// ✓ n=8, m=7, j=6harpo(3,,8);// ✗ 不能跳过m!

实用示例:字符串截取函数

#include<iostream>usingnamespacestd;// 函数声明(设置默认参数)char*left(constchar*str,intn=1);intmain(){charsample[]="Hello World";char*ps1=left(sample,5);// 前5个字符cout<<ps1<<endl;// 输出: Hellodelete[]ps1;char*ps2=left(sample);// 使用默认值,前1个字符cout<<ps2<<endl;// 输出: Hdelete[]ps2;return0;}// 函数定义char*left(constchar*str,intn){if(n<0)n=0;// 修正:原文代码有误,应该是n<0char*p=newchar[n+1];// 分配内存inti;for(i=0;i<n&&str[i];i++)p[i]=str[i];p[i]='\0';// 添加终止符returnp;}

二、函数重载:一个名字,多种功能

什么是函数重载?

函数重载允许我们创建多个同名但参数不同的函数。编译器会根据调用时提供的参数来决定使用哪个版本。

重载的关键:函数特征标

特征标指的是函数的参数类型、数量和顺序。只要特征标不同,就可以重载:

// 这些函数可以重载(特征标不同)voidprint(constchar*str,intwidth);voidprint(doubled,intwidth);voidprint(longl,intwidth);voidprint(inti,intwidth);voidprint(constchar*str);// 参数数量不同

调用时如何匹配?

print("Pancakes",15);// 匹配第一个print("Syrup");// 匹配最后一个print(1999.0,10);// 匹配第二个print(1999,12);// 匹配第四个

不能重载的情况:

  1. 仅返回类型不同

    longgronk(intn,floatm);doublegronk(intn,floatm);// 错误!特征标相同
  2. const和非const引用(特殊情况)

    doublecube(doublex);doublecube(double&x);// 可能导致歧义

引用参数的重载技巧

voidsink(double&r1);// 匹配可修改的左值voidsank(constdouble&r2);// 匹配const左值和右值voidsunk(double&&r3);// 仅匹配右值

示例:

doublex=55.5;constdoubley=32.0;sink(x);// ✓ 调用sink(double&)sank(x);// ✓ 调用sank(const double&)sank(x+y);// ✓ 调用sank(const double&)sunk(x+y);// ✓ 调用sunk(double&&)

三、综合实战:重载left函数

让我们重载left函数,使其既能处理字符串,也能处理整数:

#include<iostream>usingnamespacestd;// 重载1:处理字符串char*left(constchar*str,intn=1);// 重载2:处理整数(返回前n位)unsignedlongleft(unsignedlongnum,unsignedct);intmain(){constchar*trip="Hawaii!!";unsignedlongn=12345678;// 测试字符串版本char*temp=left(trip,4);cout<<"前4个字符: "<<temp<<endl;// 输出: Hawadelete[]temp;// 测试整数版本cout<<"前3位数字: "<<left(n,3)<<endl;// 输出: 123return0;}// 整数版本实现unsignedlongleft(unsignedlongnum,unsignedct){if(ct==0||num==0)return0;// 计算数字位数unsigneddigits=1;unsignedlongn=num;while(n/=10)digits++;// 如果请求位数大于总位数,返回原数if(digits<=ct)returnnum;// 否则,去掉后面多余的数字ct=digits-ct;while(ct--)num/=10;returnnum;}

四、何时使用?选择指南

特性适用场景优点
默认参数函数大多数情况使用相同值,偶尔变化减少函数数量,简化调用
函数重载相同功能但需要处理不同类型数据接口统一,提高可读性

建议:

  • 如果只是参数数量不同,优先考虑默认参数
  • 如果需要处理不同类型的数据,使用函数重载
  • 两者结合使用,让代码既简洁又强大

五、小练习

  1. 你能写出一个函数,既能计算圆的面积(area(radius)),又能计算矩形的面积(area(length, width))吗?

  2. 设计一个打印函数,可以打印整数、浮点数和字符串,且浮点数可以指定精度(默认2位小数)。


掌握默认参数和函数重载,能让你的C++代码更加优雅和强大。在实际开发中,合理使用这两个特性,可以显著提高代码的可读性和可维护性。

记住:好的代码不仅要能运行,更要易于理解和维护!


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/22 2:14:57

2026 年学术研究 AI 写论文辅助软件权威排行榜

一、综合排行榜 TOP10&#xff08;按综合评分排序&#xff09; 排名工具名称综合评分核心特性标签适用场景1PaperRed99 分全流程王者、合规标杆、免费 AIGC 不限次检测本科 / 硕士 / 博士全阶段论文、期刊投稿、查重降重全流程2毕业之家 AI94 分中文学术全流程、真实文献引用、…

作者头像 李华
网站建设 2026/3/18 9:15:22

用于结构振动响应压缩的频率增强矢量量化变分自编码器

1. 论文中文标题 用于结构振动响应压缩的频率增强矢量量化变分自编码器 2. 论文主要内容概括 本文针对结构健康监测中振动响应数据量大、传输存储困难的问题,提出了一种频率增强的矢量量化变分自编码器(FEVQVAE)压缩方法。传统自编码器只能将数据压缩为低维浮点特征,限制…

作者头像 李华
网站建设 2026/3/19 21:31:53

高性能压缩库实现

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第一个满…

作者头像 李华
网站建设 2026/3/13 21:32:59

C++中的享元模式实战

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/3/16 13:21:47

征稿通知 | 第二十届全国知识图谱与语义计算大会(CCKS 2026)

会议时间&#xff1a;2026年8月21日-23日会议主页&#xff1a;https://sigkg.cn/ccks2026/全国知识图谱与语义计算大会&#xff08;China Conference on Knowledge Graph and Semantic Computing&#xff0c;CCKS&#xff09;由中国中文信息学会语言与知识计算专业委员会主办&a…

作者头像 李华