0
点赞
收藏
分享

微信扫一扫

第6章 函数【C++】


第6章 函数

在前面我们已经使用过定义main函数,以及也见过其他的自定义函数,​​函数​​是一个命名了的代码块,我们通过调用函数执行相应的代码,函数可以有0个或多个参数,而且通常产生一个结果,C++可以重载函数,也就是说,同一个名字可以对应几个不同的函数

函数基础

函数的实参的类型要与函数的形参类型匹配,后者实参赋值给形参可以进行类型转换。

//example1.cpp
#include <iostream>
using namespace std;

//编写函数 返回类型为int
int double_(int num)
{
return 2 * num;
}

int main(int argc, char **argv)
{
//调用函数
cout << double_(3) << endl; //实参为3
//形参为num
return 0;
}

函数参数列表

函数的形参可以为多个,形成函数的形参列表

//example2.cpp
#include <iostream>
using namespace std;

int mul(int num1, int num2)
{
return num1 * num2;
}

int main(int argc, char **argv)
{
cout << mul(2, 3) << endl; // 6
return 0;
}

局部对象

在C++中,名字是有作用域的,对象有生命周期,形参和函数内部定义的变量统称为​​局部变量​​,其作用域在函数内部,且一旦函数执行完毕,相应内存资源被释放即栈内存。分配的栈内存将会保留,直到我们调用free或者delete。

//example3.cpp
#include <iostream>
using namespace std;
int &func()
{
int i = 999;
return i;
}

int *func1()
{
int *i = new int(999);
return i;
}

int main(int argc, char **argv)
{
int *num = func1();
cout << *num << endl; // 999
delete num;
int &i = func();
cout << i << endl;
//程序会报错,为什么,因为func调用完毕后其内的i变量内存被释放,所以相应的引用是无效的
return 0;
}

局部静态组件

局部静态对象在程序的执行路径第一次经过对象定义语句时进行初始化,并且直到程序终止才被销毁,在此期间即使对象所在的函数结束执行也不会对它有影响。

//example4.cpp
#include <iostream>
using namespace std;
int count()
{
static int num = 0;
++num;
return num;
}
int main(int argc, char **argv)
{
cout << count() << endl; // 1
cout << count() << endl; // 2
for (int i = 0; i < 4; i++)
{
cout << count() << endl; // 3 4 5 6
}
return 0;
}

函数声明

函数的名字必须在使用前声明,与变量类似,函数只能定义一次,但可以声明多次。

//example5.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
// func();// error: 'func' was not declared in this scope
//在每调用前没有声明或者定义
return 0;
}

void func()
{
cout << "hello function" << endl;
}

声明提升

//example6.cpp
#include <iostream>
using namespace std;

void func(); //函数声明

int main(int argc, char **argv)
{
func();
return 0;
}

//函数定义
void func()
{
cout << "hello function" << endl;
}

在头文件中进行函数声明

//example7.cpp
#include "example7.h"
#include <iostream>
int main(int argc, char **argv)
{
func(); // hello world
return 0;
}

void func()
{
std::cout << "hello world" << std::endl;
}

自定义头文件

//example7.h
#ifndef __EXAMPLE7_H__
#define __EXAMPLE7_H__

void func(); //函数声明

#endif

分离式编译

一个程序可以分为多个cpp文件,也就是将程序的各个部分分别存储在不同文件中。

大致原理是,对多个cpp分别编译,然后将多个编译后的部分进行链接操作形成了整体的程序,虽然在多个cpp中编写,但是我们只有一个全局命名空间,也就是说在多个cpp内定义相同名字的变量这是不被允许的。

example8.cpp

//example8.cpp
#include <iostream>
#include "func.h"
using namespace std;
// int i = 999;
//出错因为func.cpp已经定义了int i,不能有重复定义,全局命名空间只有一个
int main(int argc, char **argv)
{
func(); // hello world
return 0;
}

func.cpp

//func.cpp
#include "func.h"
#include <iostream>
using namespace std;
int i = 999;
void func()
{
cout << "hello world" << endl;
}

func.h

#ifndef __FUNC_H__
#define __FUNC_H__
void func();
#endif

分别编译并且最后链接

g++ -c example8.cpp
g++ -c func.cpp
g++ example8.o func.o -o example8.exe
./example8.exe

或者编译并链接

g++ example8.cpp func.cpp -o example8.exe
./example8.exe



举报

相关推荐

0 条评论