c++中 缺省定义 函数重载 引用

##概要

本片博客 的主要内容有, c++中函数缺省定义、 函数重载的机制 、函数名在VS环境下编译后的修改,引用 及其 注意事项。最后列了一个表

缺省定义

缺省参数

缺省参数是声明或者定义函数的参数的时候指定一个默认值。在调用该函数时候。如果没有指定实参,那么就采用默认值进行处理。

  		void TestRet(int number = 10)
    	{
    		cout << number <<endl;
    	}
    
    	int main()
    	{
    		TestRet();
    		TestRet(100);
    		return 0;

以上函数中,第一个TestRet将打印默认值 10。第二个TestRet将打印传输值 100。

缺省参数的分类

全缺省参数 :所有的参数都带有缺省值。


int TestFunc(int a=10,int b=20,int c=30)
{
	cout<< a <<endl;
	cout<< b <<endl;
	cout<< c <<endl;
}

半缺省参数 : 只能从右向左依次写入缺省

    int TestFunc(int a=10,int b=20,int c)
    {
    	cout<< a <<endl;
    	cout<< b <<endl;
    	cout<< c <<endl;
    }

注意事项:

1.半缺省参数必须从右向左来写入,不能间隔着写出来

2.缺省参数不能同时在声明和定位的位置,要么在函数声明的时候设定好缺省,要么在定义函数的时候设定缺省。

3.缺省的值必须是常量,和全局变量

函数重载

重载的定义

函数重载的概念:对于同一个作用域来说,函数的名字必须相同,参数列表必须不同。其中参数列表包含了参数的个数,参数的类型,类型的次序,与返回值的类型没有关系.

一下例子是错误的

	long TestRet(double a ,double b)
	{
		return a+b;
	}

	short TestRet(double a,double b)
	{
		return a+b;
	}

上面的例子中,参数列表完全相同,但是它的返回值类型却不相同。实际上,以上参数没有进行函数重载

函数在编译后的名字修饰问题

	int add(int a, int b);
    
    int main()
    {
    	add(1, 2);
    
    	return 0;
    }

在C语言的环境下进行编译,它的命名规则是 _ + 函数名字

在这里插入图片描述

在Vs 2013 C++的环境下进行编译,它的命名规则是 看似的杂乱的序列。

在这里插入图片描述

分析 :

首先是以 ? 号开始 + 函数的名字 + @ 表明函数的名字

接着以 YA开始 + H (表明整形) + H(表明第一个参数的类型) +H(表明第二个参数的类型) + @ 此段表明函数参数列表的内容

最后 以 Z表明这个函数的丁一结束

如果要想在C++编译环境中使用 C语言风格编译 只需要在函数前加入

extern "C" int Add(int a,int b)

引用 &

怎么使用引用 & 符号?

首先在C语言当中写一个交换程序。


	void Swap(int left, int right)
	{
		int temp = left;
		left = right;
		right = temp;
	}

这种传值调用没有函数的副作用,不会影响外部的实参,也就是说无法通过形参的改变,来改变外部的实参。

void Swap(int *left,int *right)if( left == NULL &&  right == NULL)
		{
			exit(0);
		}
	int temp = *left;
	*left = *right;
	*right = temp;
}

这种函数的副作用明显,函数使用前必须先验空。但是能够达到通过改变形参来影响实参。

这个时候C++提供了一种方便的概念,即引用 &。引用的大体意思就是给参数变量起一个别名。

	void Add(int &right,int &left)
	{
		int temp = right;
		right = left;
		left = temp;
	}

应用变量不会开辟动态内存空间。 因为它是已存在的变量的别名。

	int main()
	{
		int a = 10;
		int &ra = a;
		return 0;
	}

引用的特性:

1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一但被定义就不能再次引用了

引用的常属性带来的麻烦

const类型的变量常引用分析

	int main()
	{
		const int a = 10;
		//1.  int &ra = a; 错误的做法,如果a具有常属性,那么它的引用也必须有常属性
		const int &ra = a;

		//2. int &b = 10; 10是一个立即数,它具有常属性。那么它的引用也必须有常属性
		const int &b = 10;
		
		//3.double d = 12.34;
		//  int &rd = d;

		//编译不通过,变量的类型不同,可能会造成数据丢失。

		double d = 12.34;
		const int &rd = d;
		
		return 0;
	}

对于3,出现问题的原因是,double 类型的数据被引用了int 的别名。会造成小数部分的舍去,但是 int &rd是错误的。说明double 类型的数据创建了新的空间。并且这个空间是具有常属性的。

在这里插入图片描述

引用变量作为返回值出现随机值得情况

以下代码的输出结果是 10 ,随机值,随机值。

    #include<iostream>
    using namespace std;
    
    int& TestRef()
    {
    	int ret = 10;
    	return ret;
    }
    
    int main()
    {
    	int &a = TestRef();
    	printf(" %d \n", a);
    	printf(" %d \n", a);
    	printf(" %d \n", a);
    
    	return 0;
    }

有以下运行过程:

在这里插入图片描述

c++中的关键字

数据类型:

void int char float double bool w_char

类型定义:

struct union enum class typedef

真值:

true false

类型修饰符:

long short signed unsigned

类型限定符:

const volatile restrict const_case static static_case

存储说明符:

auto register static extern thread_local mutable

其他修饰符:

inline asm

循环控制:

for while do

跳转控制:

break continue return goto

分支结构:

if else switch case default

内存管理:

new delete

访问限定符:

this friend virtual mutable explicit operator

类访问修饰符:

private protected public

模板:

template typename

命名空间:

namespace using

异常处理:

throw try catch

猜你喜欢

转载自blog.csdn.net/H_Strong/article/details/83114045