前面我们已经看到过一种用户(程序员)定义的数据类型:结构。除此之外,还有一些其它类型的用户自定义数据类型:

定义自己的数据类型 (typedef)

C++ 允许我们在现有数据类型的基础上定义我们自己的数据类型。我们将用关键字typedef来实现这种定义,它的形式是:

typedef existing_type new_type_name;

这里 existing_type 是C++ 基本数据类型或其它已经被定义了的数据类型,new_type_name 是我们将要定义的新数据类型的名称。例如:

typedef char C;
typedef unsigned int WORD;
typedef char * string_t;
typedef char field [50];

在上面的例子中,我们定义了四种新的数据类型: C, WORD, string_t 和 field ,它们分别代替 char, unsigned int, char* 和 char[50] 。这样,我们就可以安全的使用以下代码:

C achar, anotherchar, *ptchar1;
WORD myword;
string_t ptchar2;
field name;

如果在一个程序中我们反复使用一种数据类型,而在以后的版本中我们有可能改变该数据类型的情况下,typedef 就很有用了。或者如果一种数据类型的名称太长,你想用一个比较短的名字来代替,也可以是用typedef。

联合(Union)

联合(Union) 使得同一段内存可以被按照不同的数据类型来访问,数据实际是存储在同一个位置的。它的声明和使用看起来与结构(structure)十分相似,但实际功能是完全不同的:

union model_name {
    type1 element1;
    type2 element2;
    type3 element3;
    .
    .
} object_name;

union 中的所有被声明的元素占据同一段内存空间,其大小取声明中最长的元素的大小。例如:

union mytypes_t {
    char c;
    int i;
    float f;
} mytypes;

定义了3个元素:

mytypes.c
mytypes.i
mytypes.f

每一个是一种不同的数据类型。既然它们都指向同一段内存空间,改变其中一个元素的值,将会影响所有其他元素的值。

union 的用途之一是将一种较长的基本类型与由其它比较小的数据类型组成的结构(structure)或数组(array)联合使用,例如:

union mix_t{
    long l;
    struct {
        short hi;
        short lo;
    } s;
    char c[4];
} mix;

以上例子中定义了3个名称:mix.l, mix.s 和 mix.c,我们可以通过这3个名字来访问同一段4 bytes长的内存空间。至于使用哪一个名字来访问,取决于我们想使用什么数据类型,是long, short 还是 char 。下图显示了在这个联合(union)中各个元素在内存中的的可能结构,以及我们如何通过不同的数据类型进行访问:

匿名联合(Anonymous union)

在 C++ 我们可以选择使联合(union)匿名。如果我们将一个union包括在一个结构(structure)的定义中,并且不赋予它object名称 (就是跟在花括号{}后面的名字),这个union就是匿名的。这种情况下我们可以直接使用union中元素的名字来访问该元素,而不需要再在前面加 union对象的名称。在下面的例子中,我们可以看到这两种表达方式在使用上的区别:

union anonymous union
struct {
    char title[50];
    char author[50];
    union {
        float dollars;
        int yens;
    } price;
} book;
struct {
    char title[50];
    char author[50];
    union {
        float dollars;
        int yens;
    };
} book;

以上两种定义的唯一区别在于左边的定义中我们给了union一个名字price,而在右边的定义中我们没给。在使用时的区别是当我们想访问一个对象(object)的元素dollars 和yens 时,在前一种定义的情况下,需要使用:

book.price.dollars
book.price.yens

而在后面一种定义下,我们直接使用:

book.dollars
book.yens

再一次提醒,因为这是一个联合(union),域dollars 和yens 占据的是同一块内存空间,所以它们不能被用来存储两个不同的值。也就是你可以使用一个dollars 或yens的价格,但不能同时使用两者。

枚举Enumerations (enum)

枚举(Enumerations)可以用来生成一些任意类型的数据,不只限于数字类型或字符类型,甚至常量true 和false。它的定义形式如下:

enum model_name {
    value1,
    value2,
    value3,
    .
    .
} object_name;

例如,我们可以定义一种新的变量类型叫做color_t 来存储不同的颜色:

enum colors_t {black, blue, green, cyan, red, purple, yellow, white};

注意在这个定义里我们没有使用任何基本数据类型。换句话说,我们创造了一种的新的数据类型,而它并没有基于任何已存在的数据类型:类型color_t,花括号{}中包括了它的所有的可能取值。例如,在定义了colors_t 列举类型后,我们可以使用以下表达式 :

colors_t mycolor;
mycolor = blue;
if (mycolor == green) mycolor = red;

实际上,我们的枚举数据类型在编译时是被编译为整型数值的,而它的数值列表可以是任何指定的整型常量 。如果没有指定常量,枚举中第一个列出的可能值为0 ,后面的每一个值为前面一个值加1。因此,在我们前面定义的数据类型colors_t 中,black 相当于0, blue 相当于 1, green 相当于2 ,后面依此类推。

如果我们在定义枚举数据类型的时候明确指定某些可能值(例如第一个)的等价整数值,后面的数值将会在此基础上增加,例如:

enum months_t { january=1, february, march, april,may, june, july, august,september, october, november, december} y2k;

在这个例子中,枚举类型months_t的变量y2k 可以是12种可能取值中的任何一个,从january 到 december ,它们相当于数值1 到 12,而不是0 到 11 ,因为我们已经指定 january 等于1。

C++ 高级数据类型(六)—— 自定义数据类型相关推荐

  1. C/C++:Windows编程—Windows RPC 传递自定义数据类型、自定义数据类型数组、指针数组

    前言 该篇博文不是讲Windows rpc入门的.是笔者在实际使用Windows RPC时 所遇到的问题,以及解决方法. 笔者有这样的需求,需要从RPC Server获取大量数据,而且该数据是动态分配 ...

  2. SQL数据库语言基础之SQL Server自带数据类型、自定义数据类型与使用、创建修改数据表

    文章目录 一.几种数据类型 二.创建数据表 三.修改数据表结构 一.几种数据类型 1.Character 字符串类型 char.chr(5).varchar.varchar(5).text 数据类型 ...

  3. 【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  4. 易语言自定义数据类型转c,一步一步跟我学易语言之自定义数据类型

    自定义数据类型 什么是"自定义数据类型"?顾名思义,就是用户可以随时在程序中自行定义新的数据类型.自定义数据类型时需要设置数据类型的名称及其成员.数据类型成员各属性的设置方法等同于 ...

  5. C语言之——自定义数据类型

    目录 前言:什么是自定义数据类型 ? 一,自定义数据类型之:数据类型命名 1,深入应用typedef: 二,自定义数据类型之:结构体类型命名 1,深入理解struct结构体: 三,自定义数据类型之:联 ...

  6. 剑仙java_【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  7. ABB机器人自定义数据类型

    Abb机器人如何自定义数据类型 1.为什么要自定义数据类型? Abb机器人系统中内置了一百多种数据类型,有时根据生产工艺的要求,Abb机器人系统自带的数据类型不能满足我们的程序需求,这个时候就需要我们 ...

  8. SQL Server 数据类型(整数、浮点数据、日期与时间数据、文本和图形数据类型、货币数据类型、位数据类型、二进制数据类型)

    数据类型: 每个属性来自一个域,他的取值必须是域中的值.在SQL中域的概念用数据类型来实现,定义表的各个属性时需要指明其数据类型及长度. 一:系统数据类型       Sql Server 提供的系统 ...

  9. Hibernate高级映射技术(二)自定义数据类型StringMap (转载用于收藏)

    转载于:http://ajava.org/course/open/14004.html 核心提示:上一篇文章介绍了数据库中用;分隔的字段的一种方便的高级映射自定义数据类型StringList.这次是我 ...

  10. Hibernate高级映射技术(二)自定义数据类型StringMap(转)

    核心提示:上一篇文章介绍了数据库中用;分隔的字段的一种方便的高级映射自定义数据类型StringList.这次是我做的另一种自定义数据类型StringMap. 在商品和属性的对应关系中,一个商品对应多个 ...

最新文章

  1. 大数据处理也要安全--关于MaxCompute的安全科普
  2. Android Nine-patch
  3. 【FFMPEG源码终极解析】 avformat_open_input (一)
  4. python爬虫 asyncio aiohttp aiofiles 单线程多任务异步协程爬取图片
  5. cmd删除txt部分文字_Python识别图片中的文字
  6. java皮肤_java程序的皮肤效果实现代码
  7. html导航栏模板代码生成器,关于代码生成器的html页面模板支持更多类型的问题...
  8. synchronized方法与synchronized代码块的区别
  9. 130242014075 杨利城 《电商系统某功能模块》的需求分析与设计
  10. nanomsg 高性能通信库_NanoMsg框架|NanoMsg的简介
  11. SCL编写的阀门块实例
  12. 5.15 vs2019 静态编译_《淫巧系列一》MATLAB编译exe与生成C++库
  13. PHP中单引号与双引号用法
  14. java框架技术路线 2019.10.3
  15. 线性代数学习笔记6-4:行列式的应用(用伴随矩阵求逆矩阵、克莱姆法则解方程、行列式求面积/体积)
  16. 通过SqlDbx导出*.sql,然后倒入到SQLServer2005
  17. [moses笔记]编译含有nplm的moses解码器
  18. 蓝桥杯第八届真题 :迷宫
  19. 【经典】纪念米加艾尔·塔利维尔吉耶夫《春天的17个瞬间》音乐会[部分]
  20. 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

热门文章

  1. 【Git入门之五】版本管理
  2. wordpress在新窗口打开留言者链接
  3. 安装 groovy eclipse 插件
  4. Cisco Nexus 1000V
  5. 魔界的青蔷薇也能在人间开放了
  6. 数据统计 测试方法_统计测试:了解如何为数据选择最佳测试!
  7. 图像离群值_什么是离群值?
  8. gdal进行遥感影像读写_如何使用遥感影像进行矿物勘探
  9. 68. 文本左右对齐
  10. leetcode337. 打家劫舍 III(dfs)