C++函数带默认值的几种情形

1. 默认参数的规则

  • 默认值定义

C++支持函数参数带默认值。这里所谓的默认值,指的是在调用函数时,可以不指定某些参数,编译器会自动把默认值传递到函数调用中。

  • 默认值位置

指定默认值的参数必须位于形参列表最右端,从右往左。否则会出现二义性,编译器无法处理。

  • 默认值设置

默认值可以在函数声明或函数定义中设置,只要保证不出现参数重定义即可。

2.默认参数示例

  • 在函数声明中设置默认值

这是最常见的一种情形。主要有以下两种声明方式:

  1. 声明中给参数赋默认值
  2. 声明中用类型指定默认值
float area(float radius = 5.0);

int main()
{
  float s1 = area();
  float s2 = area(6.0);

  return 0;
}
float area(float = 5.0);

int main()
{
  float s1 = area();
  float s2 = area(6.0);

  return 0;
}

以上两种方式是等价的。

  • 在函数定义中设置默认值

如果函数直接在调用前定义,此时不需要函数声明,则默认参数可以在函数定义中直接设置。

float area(float r = 5.0)
{
  return r * r *3.14;
}

int main()
{
  float s = area();

  return 0;
}

3.注意事项

  • 默认值设置位置

不管是在声明还是在定义中设置默认值,都要确保以下两点:

  1. 函数在调用时,能获取到设置的默认值
  2. 默认值不存在重复设置

若不满足以上两个条件,编译时会报错无法通过。

float area(float r)
{
  return r * r * 3.14;
}

int main()
{
  float area(float = 5.0);

  float s1 = area();
  float s2 = area(6.0);

  return 0;
}

上面的代码是可以正常运行的,原因是在函数调用之前,声明中设置了参数的默认值,即main函数中如下语句:

float area(float = 5.0);

编译器在调用函数前检测到参数默认值,能够正常完成调用。

float area(float r = 5.0);

float area(float r = 5.0)
{
  return r * r * 3.14;
}

以上代码会编译不过,原因是编译器检测到默认参数有重定义。

  • 默认值与函数重载

函数默认值不能和函数重载形成二义性,否则编译器无法判断具体使用的是那个函数。如以下代码,函数调用存在二义性,编译不通过。

float func1(float r1, float r2 = 5.0);
float func1(float r);

float func1(float r)
{
  return r * r * 3.14;
}

float func1(float r1, float r2)
{
  return r1 * r1 * 3.14;
}

int main()
{
  float s2 = func1(6.0);

  return 0;
}
  • 默认值的类型

默认值可以是常量、全局变量或者全局函数。不可以是局部变量。原因是函数参数默认值是在编译时确定的,而局部变量存在栈上,编译时不能确定。

float globalRadius = 7.0;

float gen(float magic)
{
  return magic;
}

float func1(float r)
{
  return r * r * 3.14;
}

int main()
{
  float func1(float r = globalRadius); //全局变量做默认值,OK
  float func1(float r = gen(1.0)); //全局函数做默认值,OK
  float val = 1.0;
  float func1(float r = val); //局部变量做默认值,编译不通过

  float s2 = func1();

  return 0;
}
  • 参数是引用时的默认值

若参数是引用,不能直接将实际值设为默认值。可以将全局变量作为引用参数默认值

float globalRadius = 7.0;

float func1(float &r)
{
  return r * r * 3.14;
}

int main()
{
  float func1(float &r = 1.0); //不能将常量值设为引用参数默认值,编译不过
  float func1(float &r = globalRadius); //OK

  float s2 = func1();

  return 0;
}

原文地址:https://www.cnblogs.com/jerrybai/p/10693594.html

时间: 2024-08-07 08:23:42

C++函数带默认值的几种情形的相关文章

js设置函数参数默认值的3种方法

js默认是不支持funtion f($a=a){}这种写法的,如果想设置函数参数的默认值,可以参考如下三种方法: 第一种方法: 使用arguments,函数所有的参数都会存入arguments数组离去,所以我们可以从中获取相应的参数然后赋值 function example(a,b){ var a = arguments[0] ? arguments[0] : 1;//设置参数a的默认值为1 var b = arguments[1] ? arguments[1] : 2;//设置参数b的默认值为

ES6函数参数默认值作用域的模拟原理实现与个人的一些推测

一.函数参数默认值中模糊的独立作用域 我在ES6入门学习函数拓展这一篇博客中有记录,当函数的参数使用默认值时,参数会在初始化过程中产生一个独立的作用域,初始化完成作用域会消失:如果不使用参数默认值,不会产生这个作用域:产生疑问是因为这段代码: var x = 1; function foo(x, y = function () {x = 2;}) { var x = 3; y(); console.log(x); }; foo();//3 foo(4);//3 console.log(x);//

C# 函数参数默认值

namespace 函数参数默认值 { class Program { public static void Test(int i =100) { Console.WriteLine("{0}",i); } static void Main(string[] args) { Test(); Test(222); Console.Read(); } } } 输出:100 222

java函数参数默认值

java通过函数的重载来实现函数参数默认值 public class ParameterDefault { /** * @param args */ public String getName(String givenName,String familyName){ return givenName+"."+familyName; } public String getName(String givenName){ return getName(givenName,"Xie&

Python函数参数默认值的陷阱和原理深究(转)

add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used

类模板参数带默认值

类模板参数可以带默认值吗?答案当然是肯定的.看过STL源码的人就知道,STL里面大量使用了模板技术. 有兴趣的可以去看看STL的源码,从中可以学到不少知识. 今天,我就写一个带默认值的类模板,如下: #pragma once template<typename T, typename T defValue = NULL> class CType { public: CType() :m_value(defValue) { } ~CType() { } BOOL IsNull() const {

C++基础2 引用 函数扩展: 默认值 占位符 指针 重载 类:引用类指针 声明实现分开写

[难点]指针引用 [email protected]:~/c++$ cat main.cpp  #include <stdlib.h> #include "iostream" using namespace std; int a = 20; struct Teacher { int age; char name[64]; }; int fun1(struct Teacher ** p) { int ret = 0; if(p == NULL) { ret = -1; ret

关于函数的默认值与python闭包以及迭代器

# 在函数中如果默认值参数是一个可变的数据类型, 如果有人调用的时候改变了他. 其他位置看到的也跟着改变了 def fn(val,list=[]): list.append(val) return list print(fn(5)) # 这个位置我们给val传值了打印的结果一定是[5] print(fn(6)) # 这个位置我们继续传值发现结果是[5, 6],那么也就是说函数中参数的默认值是同一个,而不是每次调用函数生产新的默认值 # # 在函数中如果默认值参数是一个可变的数据类型, 如果有人调

【函数】plsql 函数的默认值

1.创建函数 1 CREATE OR REPLACE FUNCTION fk_url_format(url VARCHAR2,charset VARCHAR2 :='UTF-8')RETURN VARCHAR2 2 IS 3 BEGIN 4 dbms_output.put_line(charset); 5 RETURN utl_url.escape(url,TRUE,charset); 6 END;--使用DEFAULT也可以:CREATE OR REPLACE FUNCTION fk_url_