(七十四)类型别名、别名的建立

简介:

例如:

clock_t one_start;

实质上就是建立了一个int类型的变量one_start,虽然在变量名前面写的是clock_t,但他实质上是int类型的别名。

 

 

建立别名的方法:

①使用预处理器:

#define 别名 原名;

如:

#define abc double

在编译器进行处理的时候,将abc转为double进行处理。

代码:

#include<iostream>
#define abc double	//将abc认为是double进行处理

int main()
{
	using namespace std;
	abc a = 1.1;
	cout << a << endl;
	system("pause");
	return 0;
}

输出:


1.1
请按任意键继续. . .

abc正常来说,当然不是类型名,但是在使用了预处理器之后,abc可以充当类型名,并且他实质上是double类型,于是abc a=1.1;在输出abc的时候,值为1.1

 

预处理器:尚未学到,但可以猜测,#define就是预处理器。

 

 

②使用typedef,格式为:

typedef 原型名 别名;

如:

typedef double abc;

就是将abc认为是double进行处理。

 

③二者的共同点:

可以用之替代很多类型,例如指针:

#define abc double*

//或 typedef doube* abc;

abc a;

在实质上,转为double* a; 即double类型的指针a

 

④二者的区别:

#define在使用的时候,他替代时,若遇见多个变量被逗号运算符连在一起,不会替代所有的。例如代码:


#include<iostream>
#define abc double*
int main()
{
	using namespace std;
	abc a,b,c;	//实质上,就a被指针了,其他都是非指针
	a = &c;
	b = 2;
	c = 3;
	cout << a << endl << b << endl << c << endl;
	system("pause");
	return 0;
}

输出:


0035FBF0
2
3
请按任意键继续. . .

我们发现,a,b,c虽然都被类型abc一同定义,但结果就a为指针,b和c只有double类型——即b和c的运算符*被忽视了。

 

 

但是typedef不存在这种问题,在同样情况下,a,b,c三个都是指针:

代码:


#include<iostream>

int main()
{
	using namespace std;
	typedef double* abc;
	abc a,b,c;	//实质上,就a被指针了,其他都是非指针
	double d = 3.1, e = 4.1, f = 5.1;
	a = &d;
	b = &e;
	c = &f;
	cout << a << endl << b << endl << c << endl;
	system("pause");
	return 0;
}

输出:


003CFEA0
003CFE90
003CFE80
请按任意键继续. . .

这个时候,a,b,c都是指针了。

 

即——#define只对第一个起全部效果,typedef对所有都起全部效果。

 

 

⑤typedef和#define

按照说明,typedef并没有创造一个新类型,只是为已有的类型创建一个新的名称。

但是没有说明#define是不是创建了一个新类型。

 


目录
相关文章
|
13天前
|
Python
定义字段
定义字段。
7 1
|
3月前
|
C++ 容器
C++开发之using定义模板别名
using 定义模板别名   都知道 typedef可以用来定义类型别名。例如typedef unsigned int uint_t; 相当于给unsigned int类型起了个别名uint_t
24 0
|
6月前
|
编译器 数据库 C语言
8.2 C++ 引用与取别名
C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。
21 0
|
6月前
|
开发者 C++
【C++11保姆级教程】Type aliases(类型别名)、alignof and alignas(类型对齐))
【C++11保姆级教程】Type aliases(类型别名)、alignof and alignas(类型对齐))
|
6月前
|
存储 JavaScript 编译器
TypeScript-类型别名和类型别名、接口异同
TypeScript-类型别名和类型别名、接口异同
33 0
|
10月前
|
C++
C++11之模板的别名
C++11之模板的别名
57 0
|
C++
接口 vs 类型别名
接口 vs 类型别名
48 0
|
NoSQL C# 数据库管理
基于C#的ArcEngine二次开发49:修改图层名称和别名、字段名称
基于C#的ArcEngine二次开发49:修改图层名称和别名、字段名称
|
Java 数据库连接 数据库
属性名和字段名不一致| 学习笔记
快速学习属性名和字段名不一致。
属性名和字段名不一致| 学习笔记
|
JavaScript 开发者
路由-关于命名视图的名称到底是变量还是字符串的说明|学习笔记
快速学习路由-关于命名视图的名称到底是变量还是字符串的说明
50 0