C++的初始(2)

这过完清明假也是来写博客了,分享一下,跑洛阳玩了一圈最大的感受就是吃的好吃(★ ω ★)!景点人太多也是没咋去,也就去洛邑古城穿了一身汉服体验一下公子哥。这边建议有兴趣去洛阳玩的最好不要去租汉服,其实买一套更划算其实价钱差不多啥(买了一套之后的感受,心痛)。

在我们学习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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值