C++基础之引用与typedef

C++基础之引用与typedef


引用
1. 初识引用
引用就是对象的另一个名字。在实际程序中,引用主要用作函数的形式参数。我们将在后面再详细介绍引用参数。
引用是一种复合类型,通过在变量名前添加“&”符号来定义。复合类型是指用其他类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。
引用必须用与该引用同类型的对象初始化:

int ival = 1024;
int &refVal = ival;     // 正确
int &refVal2;           // 错误:引用必须初始化
int &refVal3 = 10;      // 错误:引用必须引用同类型的对象

引用只是别名,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上:

refVal += 2;            //将 refVal 指向的对象 ival 加 2

类似地,

int i = refVal;         //把和 ival 相关联的值赋给 i

Tips:当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象。不可能将引用绑定到另一个对象。

2.const 引用
const 引用是指向 const 对象的引用:

const int ival = 1024;
const int &refVal = ival;   // 正确
int &ref2 = ival;           // 错误,不能使用非const引用一个const对象

可以读取但不能修改 refVal ,因此,任何对 refVal 的赋值都是不合法的。这个限制有其意义:不能直接对 ival 赋值,因此不能通过使用 refVal 来修改 ival。
同理,用 ival 初始化 ref2 也是不合法的:ref2 是普通的非 const 引用,因此可以用来修改 ref2 指向的对象的值。通过 ref2 对 ival 赋值会导致修改 const 对象的值。为阻止这样的修改,需要规定将普通的引用绑定到 const 对象是不合法的。
Tips:
const 引用可以初始化为不同类型的对象或者初始化为右值,如字面值常量:

int i = 42;
const int &r = 42;
const int &r2 = r + i;

同样的初始化对于非 const 引用却是不合法的,而且会导致编译时错误。
观察将引用绑定到不同的类型时所发生的事情,最容易理解上述行为。假如我们编写

double dval = 3.14;
const int &ri = dval;

编译器会把这些代码转换成如以下形式的编码:

int temp = dval;            // 创建一个临时变量temp接收dval
const int &ri = temp;       // 将ri与temp绑定

如果 ri 不是 const,那么可以给 ri 赋一新值。这样做不会修改 dval,而是修改了 temp。期望对 ri 的赋值会修改 dval 的程序员会发现 dval 并没有被修改。仅允许 const 引用绑定到需要临时使用的值完全避免了这个问题,因为 const 引用是只读的。
非 const 引用只能绑定到与该引用同类型的对象。const 引用则可以绑定到不同但相关的类型的对象或绑定到右值。

typedef
typedef 可以用来定义类型的同义词:

typedef double wages;   // wages是double的同义词
typedef int exam_score; // exam_score 是int的同义词
typedef wages salary;   // salary是double的同义词

typedef 名字可以用作类型说明符:

wages hourly, weekly;   // double hourly, weekly;
exam_score test_result; // int test_result;

Tips:
typedef 定义以关键字 typedef 开始,后面是数据类型和标识符。标识符或类型名并没有引入新的类型,而只是现有数据类型的同义词。typedef 名字可出现在程序中类型名可出现的任何位置。

typedef 通常被用于以下三种目的:

  1. 为了隐藏特定类型的实现,强调使用类型的目的。
  2. 简化复杂的类型定义,使其更易理解。
  3. 允许一种类型用于多个目的,同时使得每次使用该类型的目的明确。
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值