/**
1:主要讲解的内容
2:域运算符
3:new、delete运算符
4:重载
5:name managling 与 extern "C"
6:带默认参数的函数
全局变量的访问
C++中增加的作用域标示符
1:用于对于局部变量同名的全局变量进行访问
2:用于表示类的成员,这将在关于累的一节中详细说明
#include <iostream>
using namespace std;
int var = 100;
int main()
{
int val = 50;
cout<< val<<endl;
cout<<::var<<endl;
return 1;
}
输出结果
50
100
new 和 delect 的用法
new opeator 分配内存+调用构造函数
opeator new 只分配内存
placement new 不分配内存、调用拷贝构造函数
#include <iostream>
using namespace std;
int main()
{
int* p = new int(31);
int* p1 = new int[10];
cout<<*p<<endl;
delete p;
delete[] p1;
return 0;
}
相同的作用域 ,如果两个函数名称相同,而参数不同,我们把
他们称为重载overload
函数重载又称为函数的多态性
函数重载不同形式
形参数量不同
形参类型不同
形参的顺序不同
形参数量和形参类型都不同
调用重载函数时,编译器通过检查实际参数的个数、类型和顺序
来确定相应的被调用函数
静态联编------------------------------------------
编译时候确定函数的入口地址
动态联编
运行时候确定函数的入口地址
通过virtual
合法的重载例子
int abs(int i);
long abs(long i);
double abs (double d);
非法的重载例子
int abs(int i);
long abs(int i);
void abs(int i);
#include <iostream>
using namespace std;
void fun(int a , int b)
{
cout<<"int fun"<<endl;
}
void fun(double a , double b)
{
cout<<"float fun"<<endl;
}
int main()
{
fun(2,3);
fun(3.3 , 4.5 );
return 0;
}
name managling 这里把它翻译为名字改编
C++ 为了支持重载 需要进行name managling
extern "C"实现C与C++ 混合编程
#include <iostream>
using namespace std;
#ifdef __cpluscplus
extern "C"
{
#endif
int add(int a,int b);
int num(int a=10);
#ifdef __cpluscplus
}
#endif
int add(int a ,int b)
{
return a+b;
}
int num(int a )
{
return a;
}
int main()
{
int he;
he = add(30,60);
cout<<he<<endl;
int newnum;
newnum = num();
cout<<newnum<<endl;
return 0;
}
函数没有声明时,在函数定义中指定形参的默认值
函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值
默认值的定义必须遵守从右到左的顺序,如果某个形参没有默认值,则它左边的参数就不能有默认值
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(){
int sum;
sum = add(10,20);
return 0 ;
}
sum=add(10,20)语句产生二义性 可以认为该语句是调用第一个函数,也可以
是第二个,因此编译器不能确定调用的是哪一个函数