自定义类型

                                      为类型自定义新的别名

语法使用说明
typedef 已有类型名 新类型名表

例如:

         typedef double Area, Volume; 这里的Area和Volume,就是为double类型新取的类型名称(Area和Volume就跟double是一个意思了)

         typedef int Natural;这里的Natural,就是为int类型新取的类型名称(Natural就跟int是一个意思了)

         Natural i1,i2;这里的i1和i2的类型,就相当于 int i1, i2;

         Area a;这里的a的类型,就相当于 double a;

         Voleme v;这里的v的类型,就相当于 double v;

 

注:此方法是从C语言继承而来的方法

using 新类型名 = 已有类型名;

例如:

         using Area = double;这里的Area,就是为double类型新取的类型名称(Area就跟double是一个意思了)

         using Volume = int;这里的Volume,就是为int类型新取的类型名称(Volume就跟int是一个意思了)

 

注:此方法是C++的方法

                                             枚举类型

语法说明

这是枚举常量:

enum 枚举类型名 {值列表}

 

例如:

         enum Weekday {SUN,MON,TUE,WED,THU,ERI,SAT}

注:如果是定义在预处理命令后面的枚举类型就是不限定作用域的枚举类型,如果是定义在类或者方法中的就是局部枚举,是C++从C语言继承过来的枚举类型。

大括号里面这些可取值列表是一些枚举常量,默认情况下SUN=0,MON=1,TUE=2,依次类推SAT=6,

枚举元素是常量。不能对它们赋值

 例如有如下定义:

                              enum Weekday {SUN,MON,TUE,WED,THU,ERI,SAT}就不能在其他位置写赋值表达式:SUN = 0; //SUN是枚举元素所以这个赋值表达式是非法的。

枚举元素具有默认值,它们默认情况下从开始头一个依次为:0,1,2,……n按一去递增。

如果我们不希望它按照默认情况下获取默认值的话,也可以在定义枚举元素的时候给枚举元素指定不同的值。

例如:

         enum Weekday {SUN = 7,MON = 1,TUE,WED,THU,ERI,SAT}

比如说在这个例子里面SUN被赋值为7,MON被赋值为1那么TUE,WED,EHU,ERI,SAT它们的值就会从MON后面依次默认按一去递增,也就是说TUE会默认为3,WED默认为4…………SAT默认为6。

如果说在这个例子里面SUN被赋值为7,MON没有被赋值那么TUE,WED,EHU,ERI,SAT它们的值就会从SUN后面依次默认按一去递增,也就是说MON会默认为8,TUE默认为9…………SAT默认为13。

注:枚举值可以进行关系运算

       我们看到枚举值实际上也就是整数的一个子集,那么它与整数之间是不是可以互通呢?

       我们能用一个整数直接给枚举值赋值吗?答:不可以

       整数值不能直接赋给枚举变量,如需要将整数赋值给枚举变量,要先进行强制数据类型转换,显式的将整数转换成枚举类型,如果整数在枚举类型的取值范围之内的话转换就会成功,否则的话转换就会失败。.

        枚举值可以给整形变量赋值,因为它是整形的子集,

这是枚举变量:

enum 枚举类型名 变量名;

或者:

         枚举类型名 变量名;;

定义枚举类型名:

                 enum 枚举类型名 {值,或值列表,或者什么都不写};

引用枚举类型名定义枚举变量:

                 枚举类型名 变量名;

为枚举变量初始化:

                 变量名 = 枚举类型名(初始化值);//如果需要其他类型的变量来给枚举赋值那么就需要强制数据类型转换:

                                      枚举类型名(值);这个是强制数据类型转换。

也可以利用static_cast完成转换,这样上面的语句又可以写成:

                                                                                                  static_cast<枚举类型名>(值)

                                         自定义类型关键字

auto val = val1 + val2;

编译器通过初始值自动推断变量的类型

例如:

         auto val = val1 + val2;

如果val1 + val2是int类型,那么val就是int类型

如果val1 + val2是double类型,那么val就是double类型

所以val的类型取决于用来初始化val的表达式的类型

decltype (类型名) 变量名 = 类型表达式;

定义一个变量与某一个表达式的类型相同,但并不用该表达式初始化变量

例如:

          decltype (类型名) 变量名 = 类型表达式;

表示变量名以类型表达式作为初始值,但变量名不会跟之前这个变量名的类型一样而是与decltype (类型名) 括号里的类型名一致。

也就是说如果我们定义一个变量想使用一个类型表达式来初始化,但是并不想取用这个表达式的类型,就可以使用decltype这个关键字

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QVariant 是 Qt 中的一个通用的值类型,可以用来存储各种类型的数据,包括基本类型、用户自定义类型、甚至指针等。但是,如果要在 QVariant 中存储用户自定义类型的对象,需要实现 QVariant::Type 类型的转换函数。这个转换函数的基本要求是将自定义类型转换为 QVariant,并将 QVariant 转换回自定义类型。这个过程可以称为类型注册,它将自定义类型与 QVariant 类型关联起来,使得 QVariant 在遇到这种类型时可以正确地进行操作。 要完成 QVariant 自定义类型的实现,首先需要了解 QVariant 的内部实现机制。QVariant 内部使用了一个类似于 Variant 类的黑盒子来存储各种类型的值,在存储、获取、转换值时,需要使用 QVariant 内部提供的接口来进行操作。 接着,将自定义类型与 QVariant 类型进行关联,用户需要实现 QVariant::Type 类型的转换函数。这个函数的实现方式取决于自定义类型的实现机制,可以使用 QVariant 提供的模板类型来序列化与反序列化自定义类型,或者手动实现这些转换函数。 完成了自定义类型与 QVariant 类型之间的关联,就可以将自定义类型的对象存储到 QVariant 中了。存储时,需要将自定义类型的对象转换为 QVariant 类型,这里需要使用 QVariant::fromValue 函数。获取时,则需要将 QVariant 类型转换为自定义类型,这里可以使用 QVariant::value 函数,并传入自定义类型的 TypeId。 总之,QVariant 自定义类型的实现需要实现 QVariant::Type 类型的转换函数,并将自定义类型与 QVariant 类型关联起来,实现自定义类型与 QVariant 类型之间的转换。在实际的应用中,需要根据自定义类型的实现机制来选择相应的序列化与反序列化方式,以便正确存储、获取自定义类型的对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值