知识点1——函数重载
在C++中,只要函数参数的类型不同,或者参数的个数不同,两个或两个以上的函数可以使用相同的函数名。
举例如下:
#include<iostream>
using namespace std;
int fun(int x);
int fun(int x, int y);
int fun(long x);
int fun(int x){
return x;
}
int fun(int x, int y){
return x + y;
}
int fun(long x){
return x;
}
int main(){
int a = 2;
int b = 3;
long c = 1000000;
cout << fun(a) << endl;
cout << fun(a, b) << endl;
cout << fun(c) << endl;
}
注:若把fun(int x, int y)
改成fun(int x = 0, int y = 0)
或fun(int x, int y = 0)
是不正确的,有二义性,系统不知道该调用哪个函数。
知识点2——引用
引用通常被称为是某个变量的别名(起外号),声明一个引用的格式如下:
数据类型 &引用名 = 已定义的变量名,eg:
int i = 5;
int &j = i;
这里,j是一个整型变量的引用,用整型变量i对它进行初始化。
当没有用引用时:
#include<iostream>
using namespace std;
int main(){
int i = 100;
int j = i;
cout<<"i = "<<i<<", j = "<<j<<endl;
i += 100;
j += 100;
cout<<"i = "<<i<<", j = "<<j<<endl;
}
最后结果是第一次i与j都输出100,第二次都输出200.
当用引用时:
#include<iostream>
using namespace std;
int main(){
int i = 100;
int &j = i;
cout<<"i = "<<i<<", j = "<<j<<endl;
i += 100;
j += 100;
cout<<"i = "<<i<<", j = "<<j<<endl;
}
最后结果是第一次i和j都输出100,第二次都输出300。
注:引用后i与j是完全相同的东西,地址也是一样的。
- 引用作函数参数
#include<iostream>
using namespace std;
int fun(int x){
x += 100;//值传递
return x;
}
int fun(int *x){
*x += 100;
return *x;
}
int fun2(int &x){
x += 100;//引用传递,&x就是a,x加了100 a也加了100
return x;
}
int main(){
int a = 100;
fun(a);
cout<<a<<endl;
fun(&a);
cout<<a<<endl;
fun2(a);
cout<<a;
}
运行结果是:
100
200
300
引用兼具了值传递和址传递的优点。
注:上边举例的fun2与fun(值传递)是不能重载的,也有二义性。
- 用引用返回值
知识点3——结构体与类(类的初出现)
当用结构体移动一个点时,也是之前C语言的面向过程移动一个点时:
#include<iostream>
using namespace std;
struct point{
int x;
int y;
};
point move1(point p, char direct, int dis){
if(direct == 'h'){
p.x += dis;
}
else{
p.y += dis;
}
return p;
}
void move2(point *p, char direct, int dis){
if(direct == 'h'){
p->x += dis;
}
else{
p->y += dis;
}
}
void move3(point &p, char direct, int dis){
if(direct == 'h'){
p.x += dis;
}
else{
p.y += dis;
}
}
int main(){
point a = {2, 3};
/*a = move1(a, 'h', 1);
cout<<a.x<<" "<<a.y<<endl;*/
/*move2(&a, 'h', 1);
cout<<a.x<<" "<<a.y<<endl;*/
move3(a, 'h', 1);
cout<<a.x<<" "<<a.y<<endl;
}
讲了引用之后有三种方法。
当用C++的类也就是面向对象的方法让点自己移动时:
#include<iostream>
using namespace std;
class point{
private:
int x;
int y;
public:
point(int _x, int _y){
x = _x;
y = _y;
}
void move(char direct, int dis){
if(direct == 'h'){
x += dis;
}
else{
y += dis;
}
}
void print(){
cout<<x<<" "<<y<<endl;
}
};
int main(){
point a(2, 3), b(1, 2);
a.move('h', 1);
a.print();
b.move('v', -1);
b.print();
}
最后不管是用结构体还是用类都可以运行成功,不过结构体中是我们让点移动,类中是点自己移动。它们的区别在于主语不同,类是一个很有用的知识。