C++重载、缺省函数、命名空间

本文主题

经过半年的C语言和数据结构的学习,本文开始我正式进行C++的学习,在此将学到的内容分享给大家
下面说一下本文要达成的目标:

  1. 简单了解C++
  2. 为什么C++支持函数重载
  3. 缺省参数的用法
  4. 命名空间的作用

简单了解C++

不想听我啰嗦的同学只想看C++的重载和其他的可以直接跳过此段。

这里总结一下C++ primer plus中关于C和C++的区别
C语言作为过程性(procedural)语言,强调编程的算法方面,面向过程就是将问题分解成若干步骤,每个步骤可以用分别的函数实现。
C++则不同于C,他拥有C的特性,但同时他有自己的特性——面向对象,建立对象是为了解决整个问题而不是某一步。

举个例子就好比字符串,C语言中处理字符串使用的是char*,但是要管理这个字符串则是需要一系列的函数,比如长度用的是strlen,比较strcmp,他是一个步骤一个步骤分开的。
C++中对于字符串有string类,他的存在是为了处理所有和字符串有关的东西,我们不需要去关心字符串的功能是怎么实现,我们只需要去用string类中提供的接口就能完成字符串的管理。

与C语言一样,C++也诞生在贝尔实验室,Bjarne Stroustrup在上世纪80年代开发了这种语言,用他的话来说,“C++主要是为了我的朋友和我不必再使用汇编、C语言或其他现代高级语言来编程而设计的。他的主要功能是可以更方便地编写出好程序,让每个程序员更加快乐”。

为什么C++支持函数重载

什么是重载

简单来说,C++的重载就是允许函数的名称相同,参数不同,而在调用的时候,可以根据参数的不同去调相应的函数,这是一个十分方便的特性。
比如我们要写一个比较函数,在C中要得到两个数的较大值,但是要比较的是整型,还有浮点型,这个时候两个函数必须名字不同,比如int intMax(int a, int b);float floatMax(float a, float b);
但是C++中,我们可以让该函数名都叫Max,分别为int Max(int a, int b);float Max(float a, float b);,而调用的时候我们只需要去直接用Max就好了,不需要去关心哪个类型调哪个函数,函数会根据参数自己判断。

为什么C++支持,C不支持重载

关于重载问题的关键在于C++和C的函数命名规则不同,我们在linux下面通过g++ -Sgcc -S来查看
在Linux下查看汇编代码(环境为CentOS 6),首先是C++的
可以很清楚看到两个Max被修饰了,_Z3Max后面跟了两个参数类型名,也就是说虽然函数名一样,但是经过修饰后两个函数名字就不一样了
C++的函数

下面开C的:
显然没有什么修饰什么的,Max就是Max,所以再定一个Max就重复了
C的函数

这就是为什么C++支持重载而C语言无法支持重载的原因

缺省函数的用法

缺省函数

缺省就是在调用函数的时候省略全部或者部分参数,这部分省略的参数由函数参数的预设值来代替
例如:

int Add(int a = 0, int b = 0)
{
    return a + b;
}

如果我们不传参数,默认a和b为0
传入参数则用参数

需要注意的点

缺省参数可以全缺省,也可以半缺省。
半缺省只能省略右边的参数,不能省略左边的参数,例如:

int Add(int a, int b = 0)
{
    return a + b;
}

而下面的例子是错误的

int Add(int a = 0, int b)
{
    return a + b;
}

这么定义有个问题是,如果调用Add(1),那么1是给a还是给b呢?

命名空间的作用

命名空间的存在是为了防止命名污染,同一个命名空间不能出现两个相同的变量

命名空间的定义

命名空间可以这么定义

namespace name
{
    int a;
}

命名空间也可以嵌套

namespace name
{
    int a;
    namespace name1
    {
        int a;
    }
}

命名空间的使用

  1. 直接展开:它可以被展开在全局域或者某一个域内,当在全局域展开时,它的有效范围是声明后所有的空间,在某一域内展开有效范围是声明开始到该域结束
  2. 使用::(作用域解析符)来访问命名空间内的成员std::cout

本文只是简单了解一下使用方法,不做过多的深入理解,如有不足,欢迎指正

猜你喜欢

转载自blog.csdn.net/Boring_Wednesday/article/details/80719491