关闭

C++ 函数

标签: c++函数lambda
374人阅读 评论(0) 收藏 举报
分类:

http://blog.csdn.net/pipisorry/article/details/72353172

定义函数

C++ 中的函数定义的一般形式如下:

return_type function_name( parameter list ){ body of the function}

在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:

  • 返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
  • 函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
  • 参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组定义函数执行任务的语句。

函数声明

函数声明会告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。

return_type function_name( parameter list );

针对函数 max(),以下是函数声明:int max(int num1, int num2);

在函数声明中,参数的名称并不重要,只有参数的类型是必需的,因此下面也是有效的声明:int max(int, int);

当您在一个源文件中定义函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,您应该在调用函数的文件顶部声明函数。

调用函数过程

函数下一语句压栈,实参从右到左压栈。。。

函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数。

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有两种向函数传递参数的方式:

调用类型描述
传值调用该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。
指针调用该方法把参数的地址复制给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。
引用调用该方法把参数的引用复制给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。

默认情况下,C++ 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例,调用 max() 函数时,使用了相同的方法。

参数的默认值

当您定义一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果实际参数的值留空,则使用这个默认值。

这是通过在函数定义中使用赋值运算符来为参数赋值的。调用函数时,如果未传递参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用传递的值。

皮皮blog



Lambda 函数与表达式

C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。

Lambda 表达式把函数看作对象。Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值。

Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:

[capture](parameters)->return-type{body}

例如:

[](int x, int y){ return x < y ; }

如果没有参数可以表示为:

[capture](parameters){body}

例如:

[]{ ++global_x; } 

在一个更为复杂的例子中,返回类型可以被明确的指定如下:

[](int x, int y) -> int { int z = x + y; return z + x; }

本例中,一个临时的参数 z 被创建用来存储中间结果。如同一般的函数,z 的值不会保留到下一次该不具名函数再次被调用时。

如果 lambda 函数没有传回值(例如 void),其回返类型可被完全忽略。

在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量传递有传值和传引用的区别。可以通过前面的[]来指定:

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

另外有一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:

[this]() { this->someFunc(); }();

from: http://blog.csdn.net/pipisorry/article/details/72353172

ref:


0
0
查看评论

C++ 函数内部定义函数原型?

在一个函数内部这样写有意义吗? { void m(); } 首先说一下函数是不能嵌套定义的。 其次这里不是定义,只是个函数声明。 函数声明的作用不用再问我了吧,C\C++语法规定,定义在当前语句之后函数,是不能直接使用的,因为函数的查找范围...
  • chinaclock
  • chinaclock
  • 2015-12-28 22:06
  • 1194

C++常用的函数

1、字符串分割函数 //字符串分割函数 vector split(string str,string pattern){     string::size_type pos;     vector result;     str+...
  • u010594850
  • u010594850
  • 2015-07-07 11:07
  • 855

c/c++ read 函数和 write 函数

1. read         #include unistd.h>         ssize_t read(...
  • king16304
  • king16304
  • 2016-08-12 15:42
  • 760

C++学习笔记之---中交换函数的几种写法与辨析

C++中交换函数的几种写法与辨析
  • u012965373
  • u012965373
  • 2015-06-21 11:24
  • 1801

C++ 类的四大函数

一个C++类一般至少有四大函数,即构造函数、拷贝构造函数、析构函数和赋值函数,一般系统都会默认。但是往往系统默认的并不是我们所期望的,为此我们就有必要自己创造他们。在创造之前必须了解他们的作用和意义,做到有的放矢才能写出有效的函数。 构造函数就是为类申明的对象初始化。比如 String str;它就...
  • mjx20045912
  • mjx20045912
  • 2008-03-08 12:36
  • 3204

C++伪函数

笔者这里用一个简单的代码片段来说明伪函数的实现和用法,及其优点。代码示例如下:       class Abs    {     public:     int oper...
  • yu452148611
  • yu452148611
  • 2015-06-30 17:18
  • 755

C++中的函数知识点详解

一、函数声明: (1)函数声明由函数返回类型、函数名和形参列表组成,这三个元素被称为函数原型; (2)如果函数定义和函数声明只有返回类型不一致,编译器会出错,属于同一声明; (3)函数声明中的形参名会被忽略; (4)函数一般在头文件中声明,然后在源文件中进行定义; (5)如果声明两个函数v...
  • zdplife
  • zdplife
  • 2016-03-19 16:27
  • 387

对c++中函数同名情况的总结

c++中函数同名的情况有三种:重载(overload),覆盖(override)和隐藏。   1.概念上的区别 重载:函数名相同,参数不同。重载函数处于同一个范围,比如同一个类中。   覆盖:函数名和参数都相同。函数处于基类和派生类中。它是针对虚函数...
  • yanguilaiwuwei
  • yanguilaiwuwei
  • 2014-11-21 12:53
  • 2591

c++中min和max函数

包含在c++标准库中头文件中,在头文件中定义了min,max的宏,若在包含的同时包含会导致函数无法使用。 提供了_cpp_min等函数来代替min函数的功能。 C++11标准:中min函数的原型 default (1) template const T& m...
  • u013349653
  • u013349653
  • 2016-04-12 20:42
  • 35301

C++拷贝文件函数

 /******************************************************************************************************///Name:      Fi...
  • booby_fly
  • booby_fly
  • 2007-12-14 14:06
  • 2038
    个人资料
    • 访问:3642797次
    • 积分:30698
    • 等级:
    • 排名:第194名
    • 原创:569篇
    • 转载:30篇
    • 译文:5篇
    • 评论:316条
    Welcome to 皮皮blog~

    博客专栏
    最新评论