第 12 節

函数提高与命名空间

0瀏覽次數0訪問次數--跳出率--平均停留

函数提高

函数默认参数

在C++中,函数的形参列表中的形参是可以有默认值的。

语法: 返回值类型 函数名 (参数= 默认值){}

示例:

int func(int a, int b = 10, int c = 10) {
    return a + b + c;
}

//1. 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
//2. 如果函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
    return a + b;
}

int main() {

    cout << "ret = " << func(20, 20) << endl;
    cout << "ret = " << func(100) << endl;


    return 0;
}

运行/观察结果: 运行后会按输出语句打印对应内容,变量值可结合初始化、赋值和函数调用顺序推导。

函数占位参数

C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置

语法: 返回值类型 函数名 (数据类型){}

在现阶段函数的占位参数存在意义不大,但是后面的课程中会用到该技术

示例:

//函数占位参数 ,占位参数也可以有默认参数
void func(int a, int) {
    cout << "this is func" << endl;
}

int main() {

    func(10,10); //占位参数必须填补


    return 0;
}

运行/观察结果: 运行后会打印示例中的变量值或地址;地址值与运行环境有关,以同类对象的相对位置和指针变化为观察重点。

函数重载

函数重载概述

**作用:**函数名可以相同,提高复用性

函数重载满足条件:

  • 同一个作用域下
  • 函数名称相同
  • 函数参数类型不同 或者 个数不同 或者 顺序不同

注意: 函数的返回值不可以作为函数重载的条件

示例:

//函数重载需要函数都在同一个作用域下
void func()
{
    cout << "func 的调用!" << endl;
}
void func(int a)
{
    cout << "func (int a) 的调用!" << endl;
}
void func(double a)
{
    cout << "func (double a)的调用!" << endl;
}
void func(int a ,double b)
{
    cout << "func (int a ,double b) 的调用!" << endl;
}
void func(double a ,int b)
{
    cout << "func (double a ,int b)的调用!" << endl;
}

//函数返回值不可以作为函数重载条件
//int func(double a, int b)
//{
//  cout << "func (double a ,int b)的调用!" << endl;
//}

int main() {

    func();
    func(10);
    func(3.14);
    func(10,3.14);
    func(3.14 , 10);
    

    return 0;
}

运行/观察结果: 运行后会按输出语句打印对应内容,变量值可结合初始化、赋值和函数调用顺序推导。

函数重载注意事项

  • 引用作为重载条件
  • 函数重载碰到函数默认参数

示例:

//函数重载注意事项
//1、引用作为重载条件

void func(int &a)
{
    cout << "func (int &a) 调用 " << endl;
}

void func(const int &a)
{
    cout << "func (const int &a) 调用 " << endl;
}

//2、函数重载碰到函数默认参数

void func2(int a, int b = 10)
{
    cout << "func2(int a, int b = 10) 调用" << endl;
}

void func2(int a)
{
    cout << "func2(int a) 调用" << endl;
}

int main() {
    
    int a = 10;
    func(a); //调用无const
    func(10);//调用有const

    //func2(10); //碰到默认参数产生歧义,需要避免


    return 0;
}

运行/观察结果: 运行后会打印示例中的变量值或地址;地址值与运行环境有关,以同类对象的相对位置和指针变化为观察重点。

命名空间与名称冲突

在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。

因此,引入了 命名空间 这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。

定义命名空间

命名空间的定义使用关键字 namespace ,后跟命名空间的名称,如下所示:

namespace namespace_name {
   // 代码声明
}

运行/观察结果: 这段偏语法定义,通常需要配合调用代码一起编译,重点看定义方式和使用位置。

为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示:

name::code;  // code 可以是变量或函数

运行/观察结果: 这段是语法或接口示例,重点观察写法;放入完整程序后再运行验证。

using 指令

您可以使用 using namespace 指令,这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器,后续的代码将使用指定的命名空间中的名称。

#include <iostream>
using namespace std;

// 第一个命名空间
namespace first_space{
   void func(){
      cout << "Inside first_space" << endl;
   }
}
// 第二个命名空间
namespace second_space{
   void func(){
      cout << "Inside second_space" << endl;
   }
}

// 第三个命名空间
namespace third_space{
   void func()
   {
      cout << "Inside second_space" << endl;
   }
}

using namespace first_space;
using second_space::func;    //(与25行代码建议不能共存,因为都导入了func()函数),(这种方法更好更推荐)

int main ()
{

   // 调用第一个命名空间中的函数
   func();
   // 调用第二个命名空间中的函数   
   func();         //(与32行代码不能共存)
   //调用第三个命名空间中的函数
   third_space::func();

   return 0;
}

运行/观察结果: 运行后会按输出语句打印对应内容,变量值可结合初始化、赋值和函数调用顺序推导。

嵌套的命名空间

命名空间可以嵌套,您可以在一个命名空间中定义另一个命名空间,如下所示:

namespace namespace_name1 {
   // 代码声明
   namespace namespace_name2 {
      // 代码声明
   }
}

运行/观察结果: 这段偏语法定义,通常需要配合调用代码一起编译,重点看定义方式和使用位置。

您可以通过使用 :: 运算符来访问嵌套的命名空间中的成员:

// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;

// 访问 namespace_name1 中的成员
using namespace namespace_name1;

运行/观察结果: 这段偏语法定义,通常需要配合调用代码一起编译,重点看定义方式和使用位置。

音乐页