C++命名空间,缺省参数,重载,引用,内联函数,

 

目录

命名空间

在C++中,可以有相同的变量名或函数名,为了解决名称冲突或名称污染,所以用【namespace + 空间名】称来划定的一个区域。在这个区域中,所有内容的作用域都仅限于本空间。

缺省参数

1、概念

举一个例子:备胎,可有可无。

在C++中,函数的参数列表可以在定义的时候赋初值,在调用函数时,如果更新了参数的值就使用更新之后的参数,否则就使用初值。在赋初值的时候可以缺省赋值,只给某几个变量赋值,这就叫缺省参数。

当声明和定义分离时,缺省参数只能出现在声明中。

2、用法

a>  可以给每个参数都赋初值

b>  可以缺省地赋值,但是必须从右向左依次赋值或从左往右依次缺省,不能跳格

1、概念

重载就是两个或多个函数,名称一样,功能最好类似,但是参数数量,顺序,类型不同,所以效果不同。常用来处理功能  类似但数据类型不同的问题。

2、原理

a>   实现原理是名称修饰,C/C++中在一个程序的编译阶段,编译器会将函数名,变量名以另一种机制重新编排,修饰为   一个全局唯一的名称。

b>   在C语言中,一个程序的编译阶段会在每个函数名称前面加一个下划线。

c>   在C++中,名称修改较复杂,通过编译机制重新编排的时候,对函数名和变量一并处理,经过修饰之后成为一个全局           唯一的名称,这种编译机制不同平台有不同规定。

引用

1、概念:

举个例子:李逵,铁牛,黑旋风。铁牛喝了一碗酒 = 李逵喝了一碗酒 , 李逵喝了一碗酒 = 铁牛喝了一碗酒。

其实就是为一个变量起了一个别名,有点类似于C中的指针

int a = 10;    int& ra = a;   rb变量(引用变量名)就是对a变量(引用实体)的引用,int&是引用变量的类型。

2、特点:

从概念上看,引用没有新开辟空间,只是起了一个别名。

但是 实现原理 需要看汇编代码,对比发现同样的代码用指针和引用实现,它们的汇编代码完全一样,所以引用的实现原理是指针,是新开辟了空间的。

3、适用场景

//做形参
void Swap(int& a, int& b){
    int temp = a;
    a = b;
    b = temp;
}

//做返回值
int& Test(int& a){
    a += 10;
    return a;
}

//错误示例
//每个函数都有自己的栈帧结构,当函数退出时,栈帧随之销毁
//返回的可能是栈帧销毁之后被覆盖过的值
int& Add(int a, int b){
    int temp = a + b;
    return temp;
}

4、注意:

a>   引用变量和引用实体的类型必须一样

b>   引用的时候必须初始化

c>   一个引用只能引用一个实体,一个实体可以被多个引用变量引用

5、和指针的区别

a>   有多级指针没有多级引用。

b>   定义指针的时候可以不初始化。

c>   有NULL指针没有NULL引用。

d>   在sizeof中,引用是变量类型的大小,指针大小视平台而定。

e>   自加, 引用时变量值加一, 指针是向后偏移至一个指向类型的位置。

f>   访问实体方式, 指针需要解引用, 引用由编译器完成。

g>   综上,引用相对安全。

内联函数

1、用法

inline + 函数名

2、概念

a>   可以对比C语言中的宏来理解。C语言中宏在预处理阶段进行简单的文本替换。

b>   C++中,如果一个函数名前面加上inline,在编译时就只是对该函数进行文本展开,并没有其独有的栈帧结构。

3、特点

a>   用空间换时间

b>   inline只是对编译器的一个建议,建议编译器进行优化,但如果函数代码过长,循环或者递归的话编译器就会忽略这个建议。

4、宏的优缺点

a>   优点:性能提高

                  代码复用性高

b>   缺点:没有类型检查,容易出错

                  代码可读性差

                  不便于调试,因为只是在预编译阶段进行的简单文本替换           

5、C++中可以替代宏的技术

a>   内联函数

b>   常量定义改为const     例如#define MAX 100   改成         const  int  MAX = 100;

c>   typedef 类型重定义

      (这是标题)extern "C"

在C++中 , 如果在一个函数前面加上这几个字就是告诉编译器按照C的规则来处理这部分代码

猜你喜欢

转载自blog.csdn.net/IronMan240/article/details/81490480