C++---变量引用和类型别名(typedef)

引用的本质是变量的别名

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;
}
  1. typedef 类型 类型别名1,类型别名...;
  2. 类型别名可以在函数内,也可以在函数前;

虽然两种方法均能建立类型别名,但是第一种方法存在弊端。define只是一种简单的字符替换,在下列情况下,会失效。

声明两个int *类型的变量;

#define address int*
address ptr1,ptr2;

我们希望声明两个地址类型的变量,但经过预处理器置换后,结果如下:

int *ptr1,ptr2;

ptr1为地址,ptr2为int型变量。

typedef 则不会出现这种情况。故推荐使用typedef创建类型别名。

像创建变量一样,只需在前面加上关键字typedef即可创建类型别名。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章