1. 命名空间
- 使用命名空间是对标识符的名称进行本地化,以避免命名冲突或名字污染。
- 定义命名空间,namespace+命名空间名称{变量,函数}
//普通的命名空间
namespace N1
{
int a = 0;
void fun1()
{
printf("N1:fun1()\n");
}
//嵌套
namespace N2
{
int a = 1;
void fun1()
{
printf("N1:N2:fun1()\n");
}
}
}
//分段定义
namespace N1
{
int b = 3;
void fun2()
{
printf("N1:fun2()\n");
}
}
int a = 10;
void fun1()
{
printf("fun1()\n");
}
void test()
{
//全局的a
printf("a: %d\n", a);
//命名空间中的成员访问形式
//命名空间+::+成员
printf("N1::a: %d\n", N1::a);
//using 命名空间::成员
using N1::b;
printf("N1::b %d\n", b);
//展开命名空间:using namespace 命名空间
//不建议,命名空间下所有成员全部暴露在全局作用域中,会和全局域中的成员发生混淆
using namespace N1;
fun2();
printf("N1::b: %d\n", b);
}
2. 缺省参数
- 缺省参数是声明或定义时为函数的参数指定一个默认值,在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定实参。
- 全缺省:所有参数都有默认值
void fun1(int a = 1, int b = 2, int c = 3)
{
cout << a << " " << b << " " << c << endl;
}
- 半缺省:部分参数设置默认值
//半缺省:部分参数设置默认值
//设置的默认值必须从右向左依次连续,中间不能有间隔
void fun2(int a, int b, int c = 3)
{
cout << a << " " << b << " " << c << endl;
}
void test()
{
fun2(1, 2);
fun2(1, 2, 4);
}
3. 函数重载
- 函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或顺序)必须不同。
int add(int a, int b)
{
return a + b;
}
double add(double a,double b)//类型
{
return a + b;
}
int add(int a, int b, int c)//参数个数
{
return a + b + c;
}
int add(int a, double b)
{
return a + b;
}
int add(double b, int a)//顺序
{
return a + b;
}
- C++支持函数重载,只要函数参数不同,修饰出来的名字就不一样
- C语言不支持函数重载,同名函数没法区分
- 在C++工程中可能需要将某些函数按照C的风格来编译,在函数前加extern “C”,即可告诉编译器,将该函数按照C语言规则来编译
4. 引用
- 引用是给已有的变量取一个别名,编译器不会为引用变量开辟内存空间,和其引用的变量共用同一块内存空间。
- 引用类型必须和引用实体是同种类型
- 类型& 引用变量名(对象名)=引用实体
void test()
{
int a = 1;
//ra是一个引用,是a的别名,指向和a相同的实体。
int& ra = a;
}
引用特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,就不能引用其他实体
- 引用可以做参数(如交换函数),也可以做返回值
//做参数
void swap(int& a, int& b)//这里的引用是外部变量的别名
{
int tmp = a;
a = b;
b = tmp;
}
//做返回值
int& count()
{
static int n = 0;
n++;
return n;
}
5. 内联函数
- 以inline修饰的函数叫内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数能提升程序的运行效率。
- 适用规模较小而又被频繁调用的简单函数。
- inline是以空间换时间的做法,不适用代码很长或者有循环或递归的函数作为内联函数。
- inline不建议声明和定义分离,会导致链接错误找不到。
inline int add(int a, int b)//定义add为内联函数
{
return a + b;
}
void test()
{
int c = add(1, 2);//实际编译时:int c=1+2;
}
6. 基于范围的for循环
- 对于一个有范围的集合,循环范围时容易出错,所以引入基于范围的for循环。
- for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
void test()
{
int arr[] = { 1,2,3,4,5,6,7,8,9 };
for (int i = 1; i < sizeof(arr) / sizeof(arr[0]); i++)
{
cout << arr[i] << " ";
}
cout << endl;
//范围for:当前数据:循环的范围
for (int e : arr)
{
cout << e << " ";
}
cout << endl;
}