域运算符 new/delete 函数重载 name mangling与extern "C" 带默认形参值的函数

域运算符

C++作用域标识符 ::

  1. 用于对与局部变量同名的全局变量进行访问
  2. 用于表示类的静态成员

new/delete 运算符

new运算符
指针变量 = new 数据类型(a) 初始化数值为a
指针变量 = new 数据类型[长度n] 指针的销毁:delete []

new一个对象
内存分配(operator new),类似malloc
调用构造函数

delete一个对象
调用析构函数
释放内存(operator delete),类似free

函数的重载

如果两个函数名称相同,而参数不同,我们把它们称为重载overload。调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数

函数重载不同形式:

形参数量不同
形参类型不同
形参的顺序不同
形参数量和形参类型都不同

如果返回类型不同而函数名相同、形参也相同,则是不合法的,编译器会报”语法错误”

int  abs(int i);  
long abs(int i); 
void abs(int i);

name mangling与extern “C”

name managling这里把它翻译为名字改编,C++为了支持函数重载,需要将函数名根据参数的不同进行name managling以便区分。

extern “C” 可以实现C与C++混合编程,被extern “C” 修饰的变量和函数是按照C语言方式进行编译和链接的,即对C语言写的函数不进行改名

一般在C的头文件中使用,如果头文件被C代码包含并用C编译器编译,则cplusplus 没有定义,extern “C" 被略过,如果头文件被C++代码包含并被C++编
译器编译,存在
cplusplus 定义故extern “c” 提示编译器不要对 {} 内函数进行改名

#ifdef __cpluscplus
extern “C”
{
#endif
...
#ifdef __cpluscplus
}
#endif

带默认形参值的函数

函数声明和定义的时候,可以给形参赋一些默认值,使用函数时,若没有给出实参,则使用指定的默认值。

默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值

void func1(int a, double b=4.5, int c=3); //合法 
void func1(int a=1, double b, int c=3);  //不合法

重载的函数中如果形参带有默认值时,可能产生二义性

int add(int x = 5, int y = 6);
int add(int x = 5, int y = 6, int z = 7);
int main(void)
{
    int sum;
    sum = add(10, 20);
    return 0;
}