这过完清明假也是来写博客了,分享一下,跑洛阳玩了一圈最大的感受就是吃的好吃(★ ω ★)!景点人太多也是没咋去,也就去洛邑古城穿了一身汉服体验一下公子哥。这边建议有兴趣去洛阳玩的最好不要去租汉服,其实买一套更划算其实价钱差不多啥(买了一套之后的感受,心痛)。
在我们学习c语言我们便知道不能有重复的同名函数,但是再c++中我们可以在不同的命名空间去命名相同的名字的函数,因为这些函数在不同的作用域。c++中在相同的作用域可不可以明明相同名字的函数呢?显然是可以。
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
void Swap(int* pa, int* pb)
{
cout << "void Swap(int* pa, int* pb)" << endl;
}
// 同一作用域 可以同名,满足重载规则
void Swap(double* pa, double* pb)
{
cout << "void Swap(double* pa, double* pb)" << endl;
}
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
//类型顺序不同也能构成重载
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}
个数不同的我相信大家都会就不再赘述了
当然也有几种大家容易陷阱去的误区如:
void Swap(int* pa, int* pb)
{
cout << "void Swap(int* pa, int* pb)" << endl;
}
//他们仅仅是名字不同,但是代表的还是相同的含义,所以不能构成函数重载
void Swap(int* px, int* py)
{
cout << "void Swap(int* pa, int* pb)" << endl;
}
还有就是返回值的问题,两个函数完全相同,但是返回值不同,这也是不构成重载的。
好,重点来了,面试题:为什么c语言不支持重载,C++支持?C++怎么支持的?
我们在写完代码后,编译器需要进行之后的操作
test.c test.cpp
预处理:展开同文件/宏替换/条件编译......
tset.i
编译:检查语法,生成汇编代码
test.s
汇编:把汇编代码转成二进制机器码
test.o
链接:生成可执行程序
实际上按照我的理解就是我们会去找这个函数的地址,然后去识别
也就是在链接时查找名字的不同,在c语言中函数的名字是不加修饰的
C++中则是去修饰函数的名字
我们在Linux操作系统下去查看他们的汇编代码(我也是萌新,听的懵懵懂懂的,借用杭哥的图,毕竟我也不会Linux)
C语言环境
C++环境
我们会发现在名字部分出现了区别,在C++中会用i来代表int,用c来代表char等等,这就是为什么C++中支持重载,而c语言不支持。
其实不看编译啥的,流氓点就是我写完函数会生成一串东西,这串东西的第一句会被找到从而来使用这串东西,c语言中这串东西的第一句不被修饰,C++中则会去修饰一下从而形成的函数重载。(头晕是正常的,我也头晕,真叫我解释我也解释的不官方(●'◡'●))
引用
说白了就是给变量取别名
int main()
{
int a = 0;
//引用:b是a的别名
int& b = a;
int& c = a;
int& d = b;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}
用&符号来取别名,还可以对别名再去别名,上面的代码便写出了,&b&c&d都代表这a。
同理我们还可以对指针变量去别名
int* p1 = &x;
// 指针变量取别名
int*& pr = p1;
pr=NULL;
引用特性
1.引用再定义时必须初始化
2.一个变量可以又多个引用
3.引用一旦引用一个实体,在不能引用其他实体
引用的时候要注意权限,主意变量本身的限制。
int main()
{
//权限的平移
int x = 0;
int& y = x;
//权限的缩小,可以
const int& z = x;
//z++; 不可以
y++;
// p1可以修改 *p1不可以,const修饰是的*p1
const int* p1 = &m;
// p1++;
// int* p2 = p1;
const int* p2 = p1;
// 权限的缩小
int* p3 = &x;
const int* p4 = p3;
return 0;
}