#3

域运算符

newdelete运算符

重载

name managlingextern C

带默认参数的函数

域运算符

C++中增加的作用域标识符::

用于对与局部变量同名的全局变量进行访问

用于表示类的成员,这将在关于类的一节中详细说明

newdelete运算符

new运算符可以用于创建堆空间

成功返回首地址;失败返回NULL

语法:

指针变量=new 数据类型;

指针变量=new 数据类型[长度n];

例如:

        int*p; p=new int;

        char*pStr=new char[50];


delete运算符可以用于释放某块(例如:*p指向的)堆空间

语法:

        delete指针变量;

        delete[] 指针变量;

例如:

        deletep;

        delete[] pStr;


对于对象,new一个新对象,C++有如下动作:

a.内存分配(operator new)

b.调用构造函数

delete释放一个对象,C++有如下动作:

a.调用析构函数

b.释放内存(operator delete)


重载

函数重载的定义:

相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载overload(函数重载又称为函数的多态性)

函数重载不同形式:

a.形参数量不同

b.形参类型不同

c.形参的顺序不同

d.形参数量和形参类型都不同

故,调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定相应的被调用函数。


合法的重载例子:

int abs(int i);

long abs(long l);

double abs(double d);

非法的重载例子:

int abs(int i);

long abs(int i);

void abs(int i);

注意事项:

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

name managlingextern “C”

name managling这里把它翻译为名字改编,C++为了支持重载,需要进行name managling

extern “C”实现CC++混合编程


#ifdef __cpluscplus

extern C

{

#endif

...

#ifdef __cpluscplus

}

#endif


带默认形参值的函数

函数声明或者定义的时候,可以给形参赋一些默认值;调用函数时,若没有给出实参,则按指定的默认值进行工作。

注意事项:

a. 函数没有声明时,在函数定义中指定形参的默认值;函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值。

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

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

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

函数调用时,实参与形参按从左到右的顺序进行匹配

c. 重载的函数中如果形参带有默认值时,可能产生二义性;故,对于重载函数赋形参默认值。

int add(int x=5, int y=6);

int add(int x=5, int y=6, int z=7);

int main() {

        intsum;

        sum=add(10,20);

        return0;

}


int add(int x, int y)

{

  return x+y;

}

int add(int x,  int y, int z)

{

  return x+y;

}

sum=add(10,20)语句产生二义性性,可以认为该语句是调用第一个函数,也可以是第二个,因此编译器不能确定调用的是哪一个函数。