##概要
本片博客 的主要内容有, 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