C++中增加的作用域标识符::
1、用于对与局部变量同名的全局变量进行访问
2、用于表示类的成员
#include<iostream>
using namespace std;
int val=100;
int main()
{
int val=40;
cout<<val<<endl;
cout<<::val<<endl;//加上作用域标识符 访问全局变量
return 0;
}
New和Delete运算符
New运算符可以用来创建堆空间(相当于malloc) 成功返回首地址 失败直接抛出异常
语法 指针变量=New 数据类型 指针变量=New 数据类型[长度n]
堆上开辟的空间要手动释放 用Delete
#include<iostream>
using namespace std;
int val=100;
int main()
{
int *p=new int;//分配四个字节 分配一个整数空间 operator new 像malloc一样仅仅只分配内存
//int *p=new int(33);//分配四个字节 分配一个整数空间存放整数33 new operator
cout<<*p<<endl;//内容随机
int *p2=new int[10];//分配连续的10个整数空间 40字节 用循环语句初始化
delete p;
delete[] p2;
//new 的时候有[] delete的时候必须加上[]否则释放的空间不确定 []表示分配n个连续的数据类型的空间
//()表示只分配一个空间对这个空间初始化
return 0;
}
New一个新对象()1、分配内存(调用operator new) 2、调用构造函数 malloc只做内存的分配
Delete释放一个对象 1、调用析构函数 2、释放内存(调用operator delete )
new operator 分配内存+调用构造函数
operator new 分配内存
placement new 不分配内存、调用拷贝构造函数
重载:
1、相同的作用域, 如果两个函数名称相同,而参数不同,我们把它们称为重载overload
2、函数重载又称为函数的多态性(静态多态 编译时确定函数入口地址)
3、函数重载的不同形式:
形参数量不同
形参类型不同
形参的顺序不同
形参类型和形参数量都不同
4、调用重载函数时,编译器通过检查实际参数的个数、类型和顺序来确定被调用函数
编译时确定函数的入口地址称为静态联编 (函数重载实现)
运行时确定函数的入口地址称为动态联编(虚函数实现)
#include<iostream>
using namespace std;
void fun(int a,int b)
{
cout<<"int fun"<<endl;
}
void fun(double a,double b)
{
cout<<"double fun"<<endl;
}
int main()
{
fun(1,2);
fun(1.3,2.5);
return 0;
}
如果返回类型不同,而函数名相同、形参也相同,则是不合法的编译器会报“语法错误”
name managling 名字改编
C++为了支持重载,需要进行 name managling
extern"C"实现C与C++的混合编程
extern"C"表示不进行名字改编 按照C语言的形式执行 C语言不进行名字改编 所以C语言也就不支持重载
#ifdef _cpluscplus//使用了C++的规则
extern"C"
{
#endif
...
#ifdef _cpluscplus
}
#endif
带默认形参值的函数
函数声明或者定义的时候,可以给形参赋一些默认值
调用函数时,若没有给出实参,则按指定的默认值进行工作。
函数没有声明时,在函数定义中指定形参的默认值
函数既有定义又有声明是,声明时指定后,定以后就不能再指定默认值
默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值
void fun(int a,double b=4.2,int c=3)//合法
void fun(int a=1,double b ,int c=4)//不合法
函数调用时,实参与形参按照从左到右的顺序进行匹配
带默认形参值得函数的二义性
重载的函数中如果形参带有默认值时,可能产生二义性
int add(int x=5,int y=6);
int add(int x=5,int y=6,int z=7);
int main()
{
int sum;
sum=add(10,20);//此时两个函数都可以匹配 产生二义性 编译器无法确定调用的是那个函数
return 0;
}