#3
域运算符
new、delete运算符
重载
name managling与extern “C”
带默认参数的函数
域运算符
C++中增加的作用域标识符::
用于对与局部变量同名的全局变量进行访问
用于表示类的成员,这将在关于类的一节中详细说明
new、delete运算符
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 managling与extern “C”
name managling这里把它翻译为名字改编,C++为了支持重载,需要进行name managling。
extern “C”实现C与C++混合编程
#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)语句产生二义性性,可以认为该语句是调用第一个函数,也可以是第二个,因此编译器不能确定调用的是哪一个函数。
转载于:https://blog.51cto.com/8893982/1407386