问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++入门——“命名空间”、“缺省参数”、“函数重载”、“引用”

创作时间:
作者:
@小白创作中心

C++入门——“命名空间”、“缺省参数”、“函数重载”、“引用”

引用
CSDN
1.
https://m.blog.csdn.net/2301_79972085/article/details/140336375

C++在C语言的基础上增加了许多东西,在我看来,它和它的名字一样,是C语言的Plus的Plus版本,而且支持C语言的大部分语法,让码农写起来很是别有一番韵味。在这里向大家介绍C++的一些语法结构。

一、命名空间

在进行C语言的开发当中,随着代码量的增加,或者工程变得复杂,我们进行变量或者函数的命名的时候,难免会发生重定义的情况发生,为了解决这些问题,C++中引入了命名空间。

  1. 命名空间的定义

在C++中使用“namespace”关键字来定义命名空间,它的用法和结构体类似,但是在命名空间里面我们可以定义各种各样的变量,包括函数。一般如下:

namespace Test
{
    int testval = 0;
    char testarr[10];
    int testfunc()
    {
        return 1;
    }
}
或者
namespace Test
{
    int testval = 0;
    //char testarr[10];
    int testfunc();//函数声明
}
int Test::testfunc()//这里用“Test::”表示此函数属于Test命名空间的成员函数
{
    return 1;
}

namespace Test == namespace + 命名空间的名字。不同的命名空间是单独的一个域,不同的域互不干扰。

那么应该如何访问命名空间呢?实例如下:

#include <iostream>
namespace Test
{
    int testval = 0;
    char testarr[10];
    int testfunc()
    {
        return 1;
    }
}
using namespace std;
int main()
{
    cout << Test::testfunc() << "\n" << Test::testval << endl;
    return 0;
}

运行结果如下:

在这里我们需要使用“::”来访问命名空间的内容,其中“::”表示“作用域解析运算符”(类似C语言的 ‘.’),用来访问域的内容。有了命名空间,我们就不用担心工程中出现重定义的问题了。

二、缺省参数

从名字来看,很多人应该就明白缺省参数的是什么了。“缺省参数”主要是用在函数的形式参数里面,在一些函数里面,我们如果没有特殊需求,都希望传递给函数一个默认的值,缺省参数的存在便极大地方便了开发者在这一方面的需求。

一般来说,缺省参数是很好理解的,但是需要注意以下几点:

  1. 一般都是在函数的定义或者声明里面给参数一个默认值。
  2. 给形参默认值的顺序是从右到左,且不能跳跃设置默认值。
  3. 给定实参必须是从左到右不能跳跃传递实参(在这里我认为与第2点相呼应)
  4. 在函数定义和声明分开的时候缺省参数不能在定义和声明同时出现,规定必须在声明中给定缺省值(目的是防止歧义)

以下是缺省参数的定义示例:

#include <iostream>
int Add(int a = 1, int b = 2)
{
    return a + b;
}
using namespace std;
int main()
{
    cout << Add() << endl;
    return 0;
}

运行结果:

可以看到我并没有传递参数,在这里函数直接使用了默认值进行运算。当然你还可以像正常函数一样传递参数,在这里就不演示了。

另外,缺省参数还包括全缺省和半缺省,以上示例是全缺省,半缺省遵循第二点内容,参数不必全部缺省。

三、函数重载

C++支持在同一个域当中出现同名函数这个叫做含住重载,但是要实现函数重载有以下要求:

  1. 函数参数不同,函数重载要求函数两个函数的参数不能一样具体就是参数类型的顺序不能一样,例如:
int Add(int x, int y)
{
    return x + y;
}
int Add(int a, int b)
{
    return a + b;
}

这是不被允许的因为在调用函数的时候,编译器不知道你调用的是哪一个函数,虽然编译器会自动识别参数类型。

因此,函数重载要求两个函数的参数类型和它的顺序不能完全一样。

  1. 含有全缺省参数的函数重载

例如:

void Func(int x = 1, int y = 2)
{
}
void Func()
{
}

在这里定义函数的时候是没问题的,但是我们在使用的时候可能会编译错误,当我们在使用的时候,如果不传递任何参数,那么在编译的情况下会报错,在VS环境下如图:

#include <iostream>
void Func(int x = 1, int y = 2)
{
}
void Func()
{
}
int main()
{
    Func();
    return 0;
}

这是由于没有传递任何参数,编译器不知道调用的是哪一个函数,从而产生了歧义。如果传递了参数,那么就不会发生报错。

  1. 返回值的类型不同不能构成函数重载。

四、引用

引用简言之就是给某个东西取别名,即外号一般定义如下:类型& 引用别名 = 引用对象;

int main()
{
    int a = 0;
    int& b = a;
    return 0;
}

在引用中,我们可以给变量取别名,也可以给别名取别名,在C++中默认引用是不开辟内存空间的,且对引用别名进行操作就是对引用对象进行操作。示例如下:

int main()
{
    int a = 0;
    int& b = a;
    int& c = b;
    int& d = c;
    d = 10;
    std::cout << d << std::endl;
    return 0;
}

另外,在函数传递参数的时候,引用可以代替指针,这样在函数传参的之后便不用再写“&”了,这样做就很方便。示例如下:

#include <iostream>
void Swap(int& x, int& y)
{
    int temp = x;
    x = y;
    y = temp;
}
int main()
{
    int x = 1, y = 2;
    std::cout << "交换前" << std::endl;
    std::cout << "x是:" << x << std::endl;
    std::cout << "y是:" << y << std::endl;
    Swap(x,y);
    std::cout << "交换后" << std::endl;
    std::cout << "x是:" << x << std::endl;
    std::cout << "y是:" << y << std::endl;
    return 0;
}

运行结果:

在使用引用的时候还需注意一些问题:

  1. 引用必须初始化。
  2. 引用一旦引用了一个实体,便不能再次引用其他实体(我认为与第一点相呼应)。
  3. 一个变量可以有多个引用。

第一点和第二点是很重要的,很多初学者可能会记不住,会把指针和引用混淆甚至等同。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号