命名空间
在项目中使用的变量、函数和类的名称都会存在全局作用域中,可能会导致很多冲突。所以使用命名空间的目的是对标识符的名称进行本地化,避免命名冲突。
//1.普通定义
namespace a
{
int m;//可以定义变量,也可以定义函数
int add(int x, int y)
{
return x + y;
}
}
//2.可以嵌套定义
namespace b
{
int n;
int add2(int x, int y)
{
return x + y;
}
namespace c
{
int p;
int add3(int x, int y)
{
return x + y;
}
}
}
//3.如果命名空间的名称相同,编译器最后会合成一个命名空间
namespace a
{
int q;
int add4(int x, int y)
{
return x + y;
}
}
定义了一个新的命名空间,就相当于定义了一个新的作用域。
命名空间的使用:
namespace a
{
int m=10;
int add(int x, int y)
{
return x + y;
}
}
//1.命名名称加作用域限定符
int main()
{
printf("%d", a::m);
return 0;
}
//2.using引入成员
using a::m;
int main()
{
printf("%d", m);
return 0;
}
//3.using namespace引入
using namespace a;
int main()
{
printf("%d", m);
return 0;
}
缺省参数
缺省参数是在声明或定义函数时为参数指定一个默认值。在使用该函数时,若没有给定实参就使用该默认值。
//全缺省参数
void fun1(int a=10,int b=20,int c=30)
{
//...
}
//半缺省参数
void fun2(int a , int b = 20, int c = 30)
{
//...
}
注意:
1.半缺省参数需从右往左依次给出,不能跳过
2.缺省参数不能在函数声明的定义同时给出
3.缺省值需为变量或全局变量
函数重载
同名函数,但形参列表(参数个数、类型、顺序)必须不同
int add(int x, int y)
{
//...
}
int add(double x, double y)
{
//...
}
为什么C++支持函数重载,而C语言不支持函数重载:
因为函数名修饰规则不同:
下面通过声明未定义的方法看一下c++中函数的命名规则:
int add(int x, int y);
int add(double x, double y);
int main()
{
add(1,2);
add(1.1, 2.2);
return 0;
}
再来看看C语言的命名规则:
int add(int x, int y);
//int add(double x, double y);
int main()
{
add(1,2);
//add(1.1, 2.2);
return 0;
}
C++的命名还包括了参数的类型,而C语言中有函数的名称,所以C语言没有函数重载。
拓展一下程序运行的阶段:
引用
引用没有开辟新空间,而是给一个已存在的变量定义一个别名,共用一个内存空间。
1.引用在定义时必须初始化
2.一个变量可以有多个引用,给引用引用也可以(给别名取别名)
3.一旦引用了一个实体,就不能引用其他实体
void test()
{
int a = 10;
int& b = a;
printf("%p\n", a);
printf("%p\n", b);
}
使用场景:
//1.做参数
void test1(int& x, int& y)
{
int temp = x;
x = y;
y = temp;
}
//2.做返回值
int& count()
{
int n = 2;
//返回n的别名
}
这里就要提到传值返回和传引用返回的区别:传值返回返回的值会储存在一个临时变量中,传引用返回则返回的时其的别名,同一块空间,出了该函数,如果栈帧没有覆盖值不会改变,若改变了后果就不堪设想。
所以函数返回时,出了函数作用域,返回对象还未返回给系统时,可以使用引用返回,若已经返回给系统了,则必须用传值返回。
内联函数
内联函数是为了避开C语言的宏做的提升,用inline修饰函数,不用建立栈帧。
先说说宏的优缺点:
优点:1.没有严格的类型要求
2.针对频繁调用的小函数,可以不用再建立栈帧,提高效率
缺点:1.语法坑较多
2.不能调试(预编译阶段就进行了替换)
3.对类型没有安全检查
inline对于编译器来说只是一个建议,编译器会自动优化,对于函数体内有循环、递归等,编译器会选择忽略内联。inline不建议声明和定义分离,如果分离的话,当inline被展开时,找不到函数地址。
auto
作为类型指示符,依据初始化表达式决定auto实际类型。
int main()
{
int a = 0;
auto b = a;
auto c = 'a';
cout << typeid(b).name << endl;
cout << typeid(c).name << endl;
return 0;
}
注意:
1.不能作为函数的参数
2.不能声明数组
指针空值nullptr
nullptr是为了衔接C语言中的错误,提出的改正,使用时不需要包含头文件,建议最好使用nullptr
c头文件中的代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
如有错误,欢迎提出。码字不容易,点个赞再走吧~~