c++用户自定义类型

本文介绍了C++中用户自定义类型的概念,包括结构体、类和枚举类型的使用方法。探讨了如何通过结构体组织数据,利用类将数据与操作结合,并通过枚举创建易于理解的整数集合。

c++用户自定义类型


可以通过基本类型,const修饰符,和声明运算符 (例如 &,*,[] )构造出的类型称为内置类型 ( built-in type)。C++ 语言的内置类型及其操作的集合非常丰富,不过相对来说更偏重底层编程。这些内置类型的优点是能够直接有效地展现出传统计算机硬件的特性,但是并不能向程序员提供便于书写高级应用程序的上层特性。为此,C++语言扩充了这些内置类到和操作,提供了一套成熟的抽象机制 (abstractionmechanism),程序员可以使用这套机制实现其所需的上层功能。C++ 抽象机制的目的主要是让程序员能够设计并实现他们自己的数据类型,这些类型具有恰当的表现形式和操作,程序员可以简单优雅地使用它们。为了与内置类型区别开来,我们把利用 C++ 的抽象机制构建的新类型称为用户自定义类型(user-defined types),诸如类和枚举等等

结构

构建一种新类型的第一步通常是把所需的元素组织成一种数据结构。下面是一个 struct的示例:

struct Vector {
	int sz; //元素的数量
    double* elem; //指向元素的指针
}

这是Vector 的第一个版本,其中包含一个int 和一个 double*一个 Vector 类型的变量可以通过下述形式进行定义:

Vector v;

仅就v本身而言,它的用处似乎不大,因为v的 elem 指针并没有指向任何实际的内容。为了让它变得更有用,我们需要令v指向某些元素。例如,我们可以构造一个如下所示的Vector :

void vector_init(Vector& v, int s){
	v.elem =new double[s]; //分配一个数组,它包舍s个double值
	v.sz = s;
}

也就是说,v的elem 成员被赋予了一个由 new 运算符生成的指针,而 sz 成员的值则是元素的个数。Vector& 中的符号 & 指定我们通过非常量引用的方式传递 v,这样 vector_init() 就能修改传入其中的向量了。
new运算符从一块名为自由存储 (free store)(又称为动态内存(dynamic memory)或堆(heap)的区域中分配内存。

Vector 的一个简单应用如下所示:

double read_and_sum(int s){//从cin 读入s个整数,然后返回这些整数的和;其中,假定s 是正的
	Vector v;
	vector_init(v, s);
	for (int i=0; i!=s; ++i)
		cin >> v.elem[i];
		
	double sum = 0;
	for (int i = 0; i != s; ++i)
		sum += v.elem[i];
	return sum;
}

显然,在灵活性和优雅程度上我们的 Vector 与标准库 vector 还有很大差距,其是Vector 的使用者必须清楚地知道它的所有细节。

对于用户自定义类型来说,为了将其所有属性捏合在一起,形成一个“真正的类型”,在表示形式和操作之间建立紧密的联系还是很有必要的。特别是,我们常常希望自己构建的类型易于使用和修改,数据的使用具有一致性,并且表示形式最好对用户是不可见的。此时,最理想的做法就是把类型的接口(所有代码都可使用的部分) 与其实现(对其他不可访问的数据具有访问权限)分离开来。在 C++ 中,实现上述目的的语言机制被称为类class)。类含有一系列成员 (member),可能是数据、函数或者类型。类的 public 成员定义该类的接口,private 成员则只能通过接口访问。例如:

class Vector{
public:
	Vector(int s): elem{new double[s]}, sz{s}{} //构建一个Vector
	double& operator[](int i){return elem[i];} //通过下标访问元素
	int size(){return sz;}
private:
	double* elem; //指向元素的指针
	int sz; //元素的数量
}

于是

Vector v(6);

总的来说,Vector 对象是一个“句柄”,它包含指向元素的指针 (elem)以及元素的数量(sz)。在不同 Vector 对象中元素的数量可能不同(本例是 6),即使同一个 Vector 对象在不同时刻也可能含有不同数量的元素 。 不过,Vector 对象本身的大小永远保持不变。这是 C++ 语言处理可变数量信息的一项基本技术:一个固定大小的句柄指向位于“别处”(即通过 new 分配的自由空间)的一组可变数量的数据

枚举

c++提供的枚举类型可通过关键字class来表明是强类型,例如:

enum class Color{red, blue, greeen};
enum class Traffic_light{green, yellow, red};

Color col = Color::red;
Traffic_light light = Traffic_light::red;

其中枚举值(如red)位于其enum class 的作用域之内,因此我们可以在不同的enum class 中重复使用这些枚举值而不致引起混淆。例如,Color::red 是指 Color 的 red,它与Traffic light::red 显然不同。
枚举类型常用于描述规模较小的整数值集合 。通过使用有指代意义的 (且易于记忆的)枚举值名字可提高代码的可读性,降低出错的风险。

enum 后面的 class 指明了枚举是强类型的,且它的枚举值位于指定的作用域中。不同的 enum class 是不同的类型,这有助于防止对常量的意外误用。在上面的例子中,我们不能混用 Traffic light和 Color 的值

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值