命名空间
有些函数,变量存在于全局作用域中,可能会发生冲突,所以引入命名空间,命名空间是对标识符的名称进行本地化,以避免命名冲突或污染。
namespace N
{
//....
}
注意:命名空间内部可以定义变量也可以定义函数
命名空间可以嵌套
namespace N1
{
namespace N2
{
//...
}
}
命名空间的使用有三种方式:
- 加命名空间及作用域限定符
int main()
{
printf("%d\n",N::a);
return 0;
}
- 使用using将命名空间成员引入
using N::b
int main()
{
printf("%d\n",b);
return 0;
}
- 使用using namespace命名空间的名称引入
using namespace N
int main()
{
printf("%d\n",c);
return 0;
}
C++输入输出
cin >> 输入
cout << 输出
注意:要包含头文件< iostream >
缺省参数
缺省参数是函数声明或定义时,为函数的参数指定一个默认值,在调用函数时,若没有指定实参,则采用该默认值。
void TestFunc(int a = 0)
{}
int main()
{
TestFunc(); //没有传参,使用默认值
TestFunc(10);// 传参时,使用指定值
return 0;
}
缺省参数的分类:
- 全缺省参数
void Func(int a = 10, int b = 20, int c = 30)
{}
- 半缺省参数
void Func(int a,int b = 10,int c = 20)
{}
注意:
1. 半缺省参数必须从右往左依次给出,不能间隔着给出
2. 缺省参数不能在函数的定义和声明中同时出现
函数重载
在相同作用域,函数名相同,但参数列表不同(个数,类型,次序)
注意:若只是返回值类型不同无法构成重载
int Func(int a = 10)
{}
double Func(int a = 10)
{}
能够重载的原因:名字修饰(name Mangling)
在vs2013下
C语言中,对函数的修饰方式为 _函数名
C++中, 对函数的修饰方式为 @@YAHH@Z 等等
在C++中,给函数加 extren “C” 是将函数按照C风格编译
extren “C” int Add(int left, int right)
{
return left+right;
}
int main()
{
Add(1,2);
return 0;
}
引用
引用是给已存在的变量取了一个别名
变量与它的引用使用的是同一块内存空间
void TestFunc()
{
int a = 10;
int &ra = a;
printf("%p\n",&a);
printf("%p\n",&ra);
}
引用的特性
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用一旦引用一个实体,不可以引用其他实体
- 引用类型必须与实体是同种类型
注意:引用可以做参数类型,也可以做返回值类型(如果以引用类型返回,返回值的生命周期必须不受函数的限制(即比函数生命周期长)
引用和指针
引用和指针的相同点
在底层实现上,引用完全按照指针的方式实现
反汇编上面代码,可以看见引用与指针一样,通过a的地址修改值
引用和指针的不同点
- 引用在定义时必须初始化,而指针没有要求
- 引用在初始化一个实体后,就不能引用其他实体,而指针可以在任何时候指向任何一个同类型的实体
- 没有NULL引用,但有NULL指针
- 在sizeof中,引用结果为引用类型的大小,而指针始终未为4字节(32)或8字节(64)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小(连续空间)
- 有多级指针,但没有多级引用
- 指针需要显示解引用,引用编译器自己处理
- 引用比指针更安全
内联函数
以inline修饰的函数叫内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,提升程序运行效率
C++替换宏:
- 常量定义用const替换
- 函数定义用内联函数替换