C++中的函数及参数介绍

函数的概念

函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

你可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由你来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。

函数还有很多叫法,比如方法、子例程或程序,等等。

函数重载

简单介绍

在相同的作用域,可以定义同名的函数,但是它们的参数要有所区分,这样的函数构成重载关系,此外函数之间能否构成重载和返回值无关。

小例子:

#include <iostream>
using namespace std;

void foo(int a) {
    cout << "foo(int)" << endl;
}

void foo(int a, int b) {
    cout << "foo(int, int)" << endl;
}

int main() {
    foo(1);
    foo(2, 3);
    return 0;
}

返回结果:
foo(int)
foo(int, int)

函数重载的原理

C++编译是通过对函数进行换名,将参数表的信息整合到新的函数名中,解决函数重载与名字冲突的矛盾。

通过nm查看目标文件中函数换名后的名字:

源文件的内容:
void func(int a, int b) {}
void func(int a, int b, int c) {}

生成目标文件:
F:\c_projects\20181011_01>g++ -c demo3.cpp

查看目标文件信息:
F:\c_projects\20181011_01>nm demo3.o
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T __Z4funcii   // 修改后的第一个函数
00000006 T __Z4funciii   // 修改后的第二个函数

当你打算让你的C程序去调用C++的程序的时候,是无法直接去函数的,因为C++的编译器会将函数修改名字,当然若是直接调用C++编译器修改后的名字也是可以的。

也可以在函数声明的时候加入extern "C",这样是要求C++编译器不对函数做换名,便于C程序去调用,但是这样的函数无法实现重载。

实例:

extern "C" void func(..){..}
extern "C" {
    void func1(..){..}
    void func2(..){..}
    ...
} 

函数的参数

缺省参数

可以为函数的部分或全部形参指定缺省值,调用该函数时,如果不给实参,就取缺省值作为相应形参的值。

例如:

#include <iostream>
using namespace std;

void func(int a = 1, int b = 2, int c = 3) {
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
    cout << "c = " << c << endl;
}

int main() {
    func();   // 当没有给函数传递参数的时候,函数的参数取的是默认给的值
    return 0;
}

结果是:
a = 1
b = 2
c = 3

缺省参数必须靠右,如果一个参数带有缺省值,那么右侧的所有参数都必须带有缺省值。

void func(int a = 10, int b = 20);//ok
void func(int a, int b = 20);//ok
void func(int a = 10, int b);//error

如果函数的定义和声明分开,缺省参数应该写在函数的声明部分,而定义部分不写。

声明:
void func(int a, int b = 100, int c = 200);

定义:
void func(int a, int b, int c) {};

void func(){函数体}//函数定义
void func();//函数声明

哑元参数

只有类型没有变量名的形参称为哑元参数。

例如:

void func(int){};

哑元参数因为没有变量名因此是不需要也不能被调用的。

一般在兼容旧代码的时候会用到。

实例:

#include <iostream>
using namespace std;

void func(int a, int) {
    cout << "哑元参数" << endl;
}

int main() {
    func(10, 20);
    return 0;
}

内联函数

使用inline关键字修饰的函数,表示这个函数是内联函数,编译器将会尝试做内联优化,避免函数调用的开销。

实例:

inline void func(...) {};

内联函数仅适用于小而简单的函数,调用次数很少或者大而复杂的函数,不适合做内联,例如递归函数。

此外内联优化知识一种建议而不是要求,能否内联主要取决于编译器,有些函数不加inline关键字也会进行内联优化,而有些函数即便加了inline关键字也会被编译器忽略。

原文地址:http://blog.51cto.com/11293981/2299859

时间: 2024-10-07 20:40:01

C++中的函数及参数介绍的相关文章

javascript中所有函数的参数都是按值传递的

[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm

Delphi中StrToDateTime函数TFormatSettings参数的使用

http://blog.csdn.net/arbin_he/article/details/7415300 Delphi中StrToDateTime函数TFormatSettings参数的使用 分类: Delphi2012-03-31 13:15 12267人阅读 评论(6) 收藏 举报 delphistring测试user [delphi] view plaincopy var FSetting : TFormatSettings; DateTime1: tDateTime; begin FS

C 中 main 函数的参数

      看到不同的人写出的 C 或者 C++ 程序时,可能会出现不一样的 main 函数的定义,下面的几种定义方式都是对的: int main(void) int main(int argc) int main(int argc, /*const*/ char** argv) int main(int argc, /*const*/ char** argv, /*const*/ char** enviorn)       这几种方式中,第三种方式是最常用的.那么,这些参数代表着什么呢?下面,

python中定义函数和参数的传递问题

作者:達聞西链接:https://zhuanlan.zhihu.com/p/24162430来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 5.2.4 函数.生成器和类 还是从几个例子看起: def say_hello(): print('Hello!') def greetings(x='Good morning!'): print(x) say_hello() # Hello! greetings() # Good morning! greetings("Wh

学习笔记:JavaScript传参方式———ECMAScript中所有函数的参数都是按值传递

我们把命名参数(arguments)视为局部变量,在向参数传递基本类型值时,如同基本类型变量的复制一样,传递一个副本,参数在函数内部的改变不会影响外部的基本类型值.如: 1 function add10(num){ 2 num += 10 ; 3 return num ; 4 } 5 var count = 10 ; 6 var result = add10(count); 7 alert(count);// 10 8 alert(result); //20 在向参数传递引用类型的值时,会把这个

向线程中的函数传入参数的注意事项

1. 当函数的形参类型为 string, 而传入的参数类型为 char[] 时, 需要在线程函数中转型, 如此可以避免空悬指针.如: void f(int, std::string const&); void oops(int some_parm) { char buffer[100]; sprintf(buffer, "%i", some_parm); //std::thread(f, 3, buffer) //not do this std::thread(f, 3, st

c#中Split函数的使用介绍

平时经常用到split,在这里做一个系统的总结. Split函数  作用      返回一个下标从零开始的一维数组,它包含指定数目的子字符串.  语法       Split(expression[,   delimiter[,   count[,   compare]]]) 其中:(1)expression 必需的.包含子字符串和分隔符的字符串表达式.如果expression是一个长度为零的字符串( " "),Split则返回一个空数组,即没有元素和数据的数组.         (2

c++中成员函数的参数名与成员变量名重合的问题

有一天写类的时候突然想到了这个问题,下面就来介绍如何解决这个问题. 定义一个类: class test{ public: void setnum(); void getnum(); private: int num; }; void test::setnum(){ num = 10; } void test::getnum(){ printf("%d\n",num); } 运行: int main() { test one; one.setnum(); one.getnum(); re

MySQL中Count函数的参数该传入什么样的值?

查询用户表中总记录 用户表中信息如下: 1.SELECT COUNT(*) FROM USER 结果为:3条 2.  SELECT COUNT(username) FROM USER 结果为:3条 3.  SELECT COUNT(sex) FROM USER 结果为:3条 4.  SELECT COUNT(birthday) FROM USER 结果为:0条 5.  SELECT COUNT(adress) FROM USER 结果为:2条 6.  SELECT COUNT(1) FROM U