《好学的C++程序设计》——2.2 别名竟然登上大雅之堂

简介:

本节书摘来自异步社区出版社《好学的C++程序设计》一书中的第2章,第2.2节,作者: 张祖浩 , 沈天晴,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.2 别名竟然登上大雅之堂

好学的C++程序设计

2.2.1 别名变量概念

别名俗称外号或绰号,如“丫蛋”、“狗熊”等。C++中把别名雅称为“引用”。但“引用”有“引而用之”的意思,难免会产生二义性。为此,本书就直用“别名”作叙述。不过,看别的书时,若看到“引用”二字,有可能是“别名”的雅称,这要注意。特别是考卷中遇到“引用”二字,要多加判断是不是“别名”的意思,否则弄不好要出错的。

变量可以取别名,这时变量名就是该别名的实名。别名和实名属于同一个变量。

别名和实名共用同一个存储空间
我们知道,变量声明后,系统会配给变量存储空间。也就是说,实名有系统所配给的存储空间。但别名声明后不另配存储空间,而是别名和实名共用同一个存储空间。两名不分彼此。访问别名和访问实名同样都是算数的。实际是对同一个存储空间进行写值或读值,实际是一回事。因此,访问别名就是访问实名。访问实名就是访问别名。可得出如下等价式:

程序1

(注释:事物A与事物B等价,一般是指A与B在某些方面具有共同的性质,人们在研究这些共同的性质时,对事物A、B不加以区分,认为A、B是同一个事物。“图片 5”是等价符号)

奖励大会公然呼请别名上台实施奖励
有的读者可能会产生疑问,既然变量有变量名,何必要另取别名?岂不多此一举?隆重的奖励大会,岂能按别名实施奖励?太不严肃了吧!

可是,拿社会生活来说,确实人人都有大名。但在好多场合,却非用别名不可!例如,体育竞赛中,按奖励规程要对头三名进行奖励。但在写奖励规程时,对奖励对象当然不可能用实名来写。只能以“冠军”、“亚军”和“季军”作为头三名的别名写出如下的奖励规程:

对“冠军”奖 8000 元 对“亚军”奖 5000 元 对“季军”奖 2000 元
待竞赛完毕,得知张三、李四和王二荣获头三名。这时,“冠军”、“亚军”和“季军”就分别是张三、李四和王二的别名啦。可得出上述三个奖励句的等价句:

程序2

用头三名的实名,来调用奖励规程实施奖励时,呼请“冠军”、“亚军”和“季军”上台领奖。按奖励规程一字一句给别名实施奖励。一切都严格按奖励规程之内的程序办。但实际来看,却是张三、李四和王二应邀上台领奖的。而奖金实际是落入张三、李四和王二的钱袋。这说明奖励(访问)别名,就是奖励(访问)实名。二者实际是一回事,真是:

奖励别名于规程之内, 实际就是 奖励实名于规程之外。
因为用头三名实名,来调用奖励规程实施奖励时,奖励别名和奖励实名实际就是一回事了。

奥运会按规程进行奖励时,国旗、国歌、运动员站位、奖章质别以及奖金等,一切都是严格按规程中的别名实施操作。看来,别名真的是登上大雅之堂了。

2.2.2 别名变量怎样声明

别名变量初次出场也必须作个声明,声明时要表明别名是何类型,是哪个变量的别名。

设已声明了一个整型变量

int a;

现在要给a另取一个别名叫x ,则可作如下声明:

int &x=a;

在声明中int和 & 一起作为一个整体,描述了x是一个int型别名变量。同时,变量a用“=”给别名变量x初始化。这里初始化的意思是确立了x是a的别名。记住!记住:谁给别名初始化,别名就是谁的。别名x是a的别名,a就是x的实名。x和a的类型必须一致。这里二者类型都是int型。

这里要注意,在声明中,一定要把int、& 和 = 作为一个整体来看,描述了x是一个int型别名变量,是变量a的别名。而变量a则是x的实名。即使是在如下的声明中:

int a=3, b=4, &x=a;

int和 &x不紧靠在一起,但仍然是在同一个声明语句中,也应把int、& 和 = 结合一起作为一个整体来看。这个整体描述了x是一个int型别名变量,是变量a的别名。如果在这里脱离整体考虑,而认为a是对&x赋值,或是对x赋值,那就错啦!

别名变量声明的一般形式为:

数据类型 & 别名变量名=变量名;

别名变量在声明的同时必须用一个同类型的变量给予初始化。这一初始化,就确定了该别名是该变量的别名,该变量是该别名的实名。这种关系终身不变。真是:一初定终身。

系统对别名变量不配给存储空间。别名和实名俩共用系统配给实名变量的存储空间。

2.2.3 用别名对变量进行访问例

上面讲了,在C++中声明别名的同时,必须用某变量来给别名初始化。以确定该别名就是该变量的别名。该变量名就是该别名的实名。有这关键的一步,就能实现“访问别名就是访问实名”,示例如下。

【例2-2】说明访问别名就是访问实名。程序如下:

#include<iostream>
using namespace std;
int main()
{
  int a=20,b=200,c=2000;                     //A
  cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<'\n';      //B
  int &x=a,&y=b,&z=c;                      //C
  { x=x+8000; y=y+5000; z=z+2000; }             //D
  cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<'\n';      //E
  return 0;
}

程序运行结果为:

a=20  b=200 c=2000               //F
a=8020 b=5200 c=4000              //G

程序中,A行声明3个int型变量a、b和c,并初始化。B行输出a、b和c,输出结果如F行所示。B行输出语句中的‘t’是横向跳格的意思,‘n’是换行的意思,见表2-2。

在C行声明了3个int型别名变量x、y和z,并且分别用变量a、b和c给予初始化。这就明确了x、y和z分别是a、b和c的别名。

在D行的一对花括弧内,对别名x、y和z都作了增值赋值。即分别取三者的原值加上一定的值后,再重新分别赋给三者。

E行又输出a、b和c,输出结果如G行所示。

奇怪!从F和G行的输出结果相比来看,a、b和c的值都变大了。可是,从整个程序来看,并未对a、b和c进行增值赋值呀!何以会变大呢?

关键在于C行的语句,用变量a、b、c分别给别名x、y、z初始化。记得吗?“谁给别名变量初始化,别名就属于谁”,这就明确了x、y和z分别是a、b和c的别名。如上所述“访问别名就是访问实名”。在D行,虽然是在花括弧内对别名进行增值赋值,但是实际就是对花括弧之外的实名(A行)进行增值赋值。具体说,就是有如下的关系:

(花括弧内)x=x+8000; 实际就是 a=a+8000;(花括弧外)
      y=y+5000; 实际就是 b=b+5000;
      z=z+2000; 实际就是 c=c+2000;

以后会看到,D行花括弧内的程序可以让一个函数来完成。到那时,可以看到如下情景:

访问别名于函数之内  实际就是  访问实名于函数之外
这恰似按奖励规程内对冠、亚、季军实施奖励,实际就是规程之外对张三、李四和王二实施奖励。在这里,先提前让大家领会一下,别名在后面内容中会有精彩表现。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接

相关文章
|
1月前
|
存储 C++ 开发者
C++程序设计基础:构建稳固的编程基石
C++程序设计基础:构建稳固的编程基石
23 1
|
6月前
|
设计模式 自然语言处理 编译器
C++程序设计介绍
C++程序设计是一种面向对象的计算机编程语言,是在C语言的基础上进行扩展和发展而来的。C++由丹尼斯·里奇在20世纪80年代初开发,它继承了C语言的特性,同时引入了类、对象、继承、多态等面向对象编程的概念和特性。C++被广泛应用于软件开发、游戏开发、嵌入式系统等领域。 C++具有以下特点: 1. 面向对象:C++是一种面向对象的编程语言,强调数据和操作的封装,通过类和对象的概念实现数据和方法的组织和管理。面向对象的编程思想使得程序更易于理解、扩展和维护。 2. 支持泛型编程:C++引入了模板的概念,可以编写泛型代码,实现对不同类型的数据进行通用处理。泛型编程提高了代码的复用性和灵活性。
37 0
|
6月前
|
存储 算法 搜索推荐
C++ 面向对象程序设计 14万字总结笔记(八)
C++ 面向对象程序设计 14万字总结笔记(八)
28 0
|
1月前
|
C++
C++程序设计:探索函数与模块化的魅力
C++程序设计:探索函数与模块化的魅力
15 0
|
5月前
|
C++
20 C++ - 面向对象程序设计案例
20 C++ - 面向对象程序设计案例
51 0
|
2月前
|
存储 数据安全/隐私保护 C++
基于C++的面向对象程序设计:类与对象的深入剖析
基于C++的面向对象程序设计:类与对象的深入剖析
38 1
|
4月前
|
C++
C++程序设计—类与对象
C++程序设计—类与对象
39 0
|
4月前
|
程序员 C++
C++程序设计函数部分(定义+实例)
C++程序设计函数部分(定义+实例)
40 0
|
5月前
|
存储 C++
C++面向对象语言程序设计期末实验
C++面向对象语言程序设计期末实验
37 0
|
5月前
|
存储 C++
C++语言面向对象程序设计实验
C++语言面向对象程序设计实验
70 0

热门文章

最新文章