学习了博主的《漫谈继承技术》系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 《灵活而奇特的C++语言特性》 ,主要包括引用、常量(const)、常量表达式(constexpr)、静态(static)、外部(expert)、类型定义(typedef)、类型别名(aliases)、类型转换、作用域解析、统一初始化、显示转换运算符、特性(attribute)、用户自定义文本、头文件、可变长度参数列表和预处理器宏。尽管这个知识清单显得有点凌乱,但是这些话题都是博主经过精心挑选,是容易混淆的语言特性。本篇我们来学习一下typedef和类型别名(aliases)的概念以及使用场景,增进大家对《灵活而奇特的C++语言特性》的理解。

typedef

typedef为已有的类型声明提供一个新的名称。可以将typedef看成已有类型声明的同义词,typedef不会创建新的类型。typedef的最常见用法是当实际类型的声明过于复杂时,提供易于管理的名称,这一情形通常出现在函数指针和模板中。当然,typedef还可以包括作用域限定符。下面咱们来举个栗子吧。

#include <iostream>

#include <string>

#include <vector>

using namespacestd;

//使用typedef给int指针取别名

typedef int*IntPtr;

//使用typedef给string矢量取别名

typedef std::vector<std::string> StringVector;

//使用typedef给函数指针类型取别名

typedef int(*FuncPtr)(std::initializer_list<int>list);

//初始化列表简化了参数数量可变函数的编写

int Sum(initializer_list<int>list)

{

intresult = 0;

//用for each累加列表中的值

foreach(constint&var in list)

{

result+= var;

}

returnresult;

}

void print(StringVector&vStr)

{

cout<< "vStr = {";

for(constauto&var : vStr)

{

cout<< var << ", ";

}

cout<< "}" << endl;

}

int main(intargc,char**argv)

{

//使用类型别名定义int指针变量

IntPtr nPtr = new int(10);

cout<< "*nPtr: "<< *nPtr << endl;

//使用类型别名定义string矢量

StringVector vStr;

//调整数组大小为2,保证能保存两个数据元素

vStr.reserve(2);

vStr.push_back("typedef");

vStr.push_back("std::vector<std::string>");

//调用函数输出数组中所有元素

print(vStr);

//使用类型别名定义函数指针变量

FuncPtr fPtr = Sum;

//通过函数指针变量调用函数

autoresult = fPtr({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});

cout<< "result:" << result << endl;

//释放堆上空间

deletenPtr;

//避免野指针

nPtr = nullptr;

return0;

}

程序运行结果:

可能有的人还是觉typedef在定义函数指针时,有点麻烦,不怎么好理解。没有关系,我们还有跟简便的方法来实现取别名的目的,而且还很容易理解。那究竟是什么呢?就是我们之前在《漫谈继承技术》系列博文中讲到的using。如果忘记了,那就把这篇博文学习完后回去再复习回顾一下!下面我们一起来探讨一下using的高级用法。我们可以把上例转换为以下实例。

#include <iostream>

#include <string>

#include <vector>

using namespacestd;

//使用using给int指针取别名

using IntPtr= int*;

//使用using给string矢量取别名

using StringVector= std::vector<std::string>;

//使用using给函数指针类型取别名

using FuncPtr= int(*)(std::initializer_list<int>list);

//初始化列表简化了参数数量可变函数的编写

int Sum(initializer_list<int>list)

{

intresult = 0;

//用for each累加列表中的值

foreach(constint&var in list)

{

result += var;

}

returnresult;

}

void print(StringVector&vStr)

{

cout<< "vStr = {";

for(constauto&var : vStr)

{

cout<< var << ", ";

}

cout<< "}" << endl;

}

int main(intargc,char**argv)

{

//使用类型别名定义int指针变量

IntPtr nPtr = new int(10);

cout<< "*nPtr: "<< *nPtr << endl;

//使用类型别名定义string矢量

StringVector vStr;

//调整数组大小为2,保证能保存两个数据元素

vStr.reserve(2);

vStr.push_back("typedef");

vStr.push_back("std::vector<std::string>");

//调用函数输出数组中所有元素

print(vStr);

//使用类型别名定义函数指针变量

FuncPtr fPtr = Sum;

//通过函数指针变量调用函数

autoresult = fPtr({1, 2, 3, 4, 5, 6, 7, 8, 9, 10});

cout<< "result:" << result << endl;

//释放堆上空间

deletenPtr;

//避免野指针

nPtr = nullptr;

return0;

}

程序运行结果:

通过上例的学习,我们发现:当typedef变得复杂时(例如前面列举的typedef用于函数指针和模板的情况),类型别名特性特别有用。关于typedef和别名(using)我们就探讨到这里了。当然,using的用法不仅仅在于别名,还可以在继承技术方面大显身手,如果想了解using的更多用法,请关注博主《漫谈继承技术》系列博文,我们将会在那里继续探讨using的用法。

如果想了解更多关于C++语言特性相关的知识,请关注博主《灵活而奇特的C++语言特性》系列博文,相信你能够在那里寻找到更多有助你快速成长和加深你对C++语言特性相关的知识和一些特性的理解和掌握。当然,如果你想了解关于继承方面的技术,请关注博主《漫谈继承技术》系列博文。

灵活而奇特的C++语言特性——typedef aliases相关推荐

  1. 灵活而奇特的C++语言特性——统一初始化

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  2. 灵活而奇特的C++语言特性——const(一)

    学习了博主的<漫谈继承技术>系列博文之后,相信大家都有所收获吧!这次博主将和大家一起探讨 <灵活而奇特的C++语言特性> ,主要包括引用.常量(const).常量表达式(con ...

  3. 语言特性与API设计

    我平时的主要工作之一,便是编写一些基础及通用的类库,能够在项目中大量复用.换句话说,我的工作目的,是让其他开发人员可以更好地完成工作.因此,如何设计更容易使用的API是我经常要考虑的东西,偶尔也会有一 ...

  4. c 11 主要的新语言特性,C 11系列

    什么是C++0x? C++0x是C++最新标准标准化过程中的曾用名,在这一系列文章中我们将介绍最新标准添加的一系列新的语言特性.在2011年9月份,C++0x正式由官方发布并命名C++11,现在很多编 ...

  5. Python语言特性和优缺点及什么是鸭子类型?

    1)Python语言特性? Python是静态还是动态类型?是强类型还是弱类型?         Python是动态强类型语言(不少人误以为是弱类型) 动态还是静态指的是编译期还是运行期确定类型 强类 ...

  6. # Python3 面试试题--Python语言特性

    Python语言特性 1 Python的函数参数传递 看两个例子: a = 1 def fun(a):a = 2 fun(a) print(a) # 1 a = [] def fun(a):a.app ...

  7. 为什么指针是个糟糕的语言特性

    1 什么是指针 本文所谓的指针(pointer) ,是指C和C++等语言中的内建的语言特性. 在不同范畴中指针这个概念有所不同.在体系结构规范中,指针指称特定的整数字节地址或者两个地址的差(地址偏移量 ...

  8. J2SE 5.0专题 之 语言特性

    J2SE 5.0专题 之 语言特性                          本文作者: 高宇翔(大胃) 1.1.        背景 J2SE(TM) 5.0正式发布至今已超过3个月的时间了 ...

  9. C++应用程序性能优化(三)——C++语言特性性能分析

    C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高 ...

最新文章

  1. 优秀!广州“土博士”刚毕业,即获海外名校终身教职!
  2. 机器学习——KNN实现
  3. javaweb学习总结(二十):JavaBean总结
  4. C++初始编程及相关的问题总结
  5. 软件测试工具LoadRunner中如何定义SLA?--转载
  6. springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换
  7. 深入浅出聊Unity3D优化:从Draw Calls到GC
  8. 使用bottle进行web开发(9):文件上传;json传递
  9. 【浙大第19届校赛:B】Even Number Theory (数论n!中有多少个质因子2+java大数)
  10. 网络代理之后无法抓包的解决方案
  11. 计算机三级网络技术 = =
  12. DCMI 接口DMA 传送数据问题
  13. tp5 给图片加水印
  14. android系统时间获取方式
  15. 漫反射实现 - UnityShader
  16. js 斐波那契—卢卡斯数列 例子 以及 变态青蛙
  17. 工单状态TECO/DLV
  18. elo匹配算法c语言,ELO算法教程
  19. 愿在以后的日子里,即使单枪匹马也能勇往直前
  20. 本地字节序和网络字节序

热门文章

  1. 鸿蒙手机升级清单,华为鸿蒙OS 2.0升级清单曝光,来看看有没有你的手机
  2. Windows10 msg命令
  3. JS:基本类型和引用类型
  4. linux nginx css,nginx配置合并js和css文件请求
  5. i5 10600k和i5 9600k的区别
  6. (附源码)php图片素材网 毕业设计110907
  7. 网络直播大范围兴起,其技术依据是什么?
  8. 无需ROOT环境手势密码绕过的思路
  9. 1.2多媒体系统的组成
  10. java面试直通车之网络技术