可爱的C++(二)

知识点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();
}

最后不管是用结构体还是用类都可以运行成功,不过结构体中是我们让点移动,类中是点自己移动。它们的区别在于主语不同,类是一个很有用的知识。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值