引用的本质是变量的别名
Type var;
Type & n =var;
实例1
int a;
int & b = a;
int * const ptr = &a;
引用b的作用与*ptr相同
注意:声明引用时必须初始化,不能先声明再定义
错误实例
int n;
int &m;
m=n;
- 引用与函数
在自定义函数中,如果形参为非引用变量,函数调用时,生成实参的副本,在自定义函数中进行运算,实参不变;
如果使用引用变量做为形参,调用函数时,直接对实参进行运算;
实例2
#include<iostream>
int addition_1(const int a,const int b);
void addone(int x);//非引用参数, copy副本,对副本进行处理(此处为加1),原数不变
void addthree(int& z);//引用形参
using namespace std;
int main()
{
int a=1,b=2,c=3;
cout<<"调用函数前:"<<a<<endl; //结果为1
addone(a);
cout<<"调用函数后:"<<a<<endl; //结果为1
cout<<"调用函数前:"<<c<<endl; //结果为3
addthree(c);//对c本身进行处理
cout<<"调用函数后:"<<c<<endl; //结果为6
//const形参与非const形参。const形参保证copy的副本也不能改变
const int m=9,n=8;
cout<<addition_1(m,n)<<endl;
cout<<addition_1(a,b)<<endl;
//a,b为非常量,也能代入const形参,但是const不能传给非const形参
return 0;
}
void addone(int x)
{
x+=1;
}
void addthree(int& z)
{
z+=3;
}
int addition_1(const int a,const int b)
{
//a=a+1;invalid,常量不能改变
return (a+b);
}
类型别名
C++存在两种简历类型别名方式:
1.使用预处理器
#define wage float
预处理器在编译程序时用float代替所有的wage,wage变为float的别名
2.typedef
typedef不会产生新的数据类型,知识为已有的类型建立新的名称。
typedef typeName aliasName;
#include <iostream>
using namespace std;
typedef int wage;
typedef wage salary;
int main()
{
typedef int fish,bird;
fish sum=10;
bird sum1=11;
wage day,week,month,year;
return 0;
}
- typedef 类型 类型别名1,类型别名...;
- 类型别名可以在函数内,也可以在函数前;
虽然两种方法均能建立类型别名,但是第一种方法存在弊端。define只是一种简单的字符替换,在下列情况下,会失效。
声明两个int *类型的变量;
#define address int*
address ptr1,ptr2;
我们希望声明两个地址类型的变量,但经过预处理器置换后,结果如下:
int *ptr1,ptr2;
ptr1为地址,ptr2为int型变量。
typedef 则不会出现这种情况。故推荐使用typedef创建类型别名。
像创建变量一样,只需在前面加上关键字typedef即可创建类型别名。