缺省参数,函数重载,引用,内联函数...

目录

缺省参数 (默认参数)

函数重载

引用

常引用

内联函数

基于范围的for循环

指针空值---nullptr


缺省参数 (默认参数)

         定义:指当函数调用中省略了实参数时自动使用的一个值。

                    例如: void func(int a = 1){...}

                    调用 func() 相当于 func (1);

        全缺省参数:所有参数都有默认值 。例: void func (int a = 0, int b = 1, int c = 2)

        半缺省参数:部分参数带有缺省值,必须从右往左依次给出 在调用赋值从左-->右

        缺省参数不能在声明和定义中同时出现。(最好出现在声明时)

 注: 缺省值是常量或者全局变量

函数重载

        定义:是函数一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数、类型、顺序)必须不同。 返回值类型是否相同无所谓。

为什么C语言不支持重载而C++可以?

              在C语言环境下调用int型的Add函数:           

                                    

              再调用float型的Add函数:

              C语言中,编译器对函数名字的修饰规则:仅在函数名前加"_"。所以当函数重载后,编译器无法解析它们的不同,所以 C语言不         能重载。

              C++环境下运行的结果:

              C++函数名修饰规则:

Visual C++的名称修饰规则 :修饰后名字由“?”开头

                                               函数名由“@”符号结尾的函数名

                                               后面跟着由“@”结尾的类名和名称空间(此处未创建类和命名空间所以没有)

                                               第一个“A”表示函数调用类型为“_cdecl”

                                               接着是函数的返回值类型及两个参数类型,由“@”结束      // int ---> H  ;  double ---> N

                                               最后由“Z”结尾

               所以,由于命名规则的不同,C语言不能函数重载而C++可以。

引用

       概念:引用并不是重新定义一个变量,而是给已存在的变量取别名,对引用的操作与对变量直接操作完全一样。它会与所引用的变量公用同一块空间,所以不用再另开辟空间。

       功能: 

            作为函数参数

// 与C语言不同,C++的引用会直接将实参地址当作参数传递
void swap(int &A, int &B)
{
    int tmp;
    A = tmp;
    A = B;
    B = tmp;    
}

            从函数中返回左值。

int &Func(int &a)
{
    a += 1;
    return a;
} 

       特性: 

            1. 一个变量可以有多个别名;

            2. 一旦引用一个实体,不能再引用其他实体;

            3. 引用类型必须和引用实体同一类型;   

       

            4. 引用定义必须初始化;

            5. 引用在编译器中是以const指针实现的,所以它与指针占相同大小的内存;

            6. 由于引用只能引用一个实体,所以它不能引用一个数组(许多元素的集合),但是可以建立数组的引用;

     

常引用

          通过声明定义前加const,使得目标变量不可通过引用修改,增加代码安全性,健壮性。

          声明方式:const 类型标识符 &引用名 = 目标变量名;

引用和指针的不同点:

          1. 引用在定义时必须初始化,指针没有要求;

          2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同一类型实体;

          3. 没有NULL引用,但有NULL指针;

          4. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4字节);

          5. 引用自加即引用的实体增加1,指针自加即指针后偏移一个类型大小;

          6. 有多级指针,但没有多级引用;

          7. 访问实体方式不同,指针需要显示解引用,引用编译器自己处理

          8. 引用比指针使用起来相对安全

内联函数

            ---既保留了宏的特性,又比较安全

          以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展

  开,没有函数压栈的开销,内联函数提升程序运行的效率,是一个以空间换时间的做法。

  但是加上inline不一定会被当作内联函数,若函数中有递归,循环,函数较长不适用做内联函数。

          inline对编译器只是一个建议。

// 由于宏定义<不开辟栈空间>不安全,产生副作用,不能调试;所以就有了内联函数。

宏的优缺点:

          优点:

             1. 增强代码的复用性;

             2. 提高性能;

          缺点:

             1. 不方便调试(预编译阶段进行了替换);

             2. 没有类型检测;

             3. 导致代码可读性差,可维护性差,容易误用。

 C++那些地方可以替换宏?

       宏函数 ---》 inline

       宏变量 ---》 const

基于范围的for循环

            语法: for(auto 迭代的变量 : 迭代的范围)

   规则:

            1. for循环范围必须确定:对于数组,就是数组的大小;

                                                    对于类,提供begin和end的方法

            2. 迭代对象实现++和==的操作

指针空值---nullptr

      C语言中表示空指针:

            int* p1 = NULL; // NULL是一个宏

                                     //  定义为:字面常量0 或者 无类型指针(void*)的常量

                                    //   考虑到兼容性,保留了NULL

            int* p2 = 0;

      C++11中:

            int* p3 = nullptr;指针空值常量

    nullptr是有类型的,其类型是nullptr_t,仅仅可以被隐式转化为指针类型;

    注意:

            1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入;

            2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占字节数相同;

            3. 为提高代码健壮性,在后续表示指针空值时建议最好使用nullptr。

猜你喜欢

转载自blog.csdn.net/timecur/article/details/84432224