《c++语言导学》——2.3 类

简介:

本节书摘来自华章计算机《c++语言导学》一书中的第2章,第2.3节,[美] 本贾尼·斯特劳斯特卢普 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.3 类

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


<a href=https://yqfile.alicdn.com/0a467a4b1e56d4da7b5856600a496edb00724182.png
" >

在此基础上,我们可以定义一个Vector类型的变量:

<a href=https://yqfile.alicdn.com/c9879021177fd084dd91463d1c3fc75a55b33480.png
" >

下图解释了这个Vector对象的含义:

11c31f4c3aff4baac4baae420ffc77eb0cd3bfa2

总的来说,Vector对象是一个“句柄”,它包含指向元素的指针(elem)以及元素的数量(sz)。在不同Vector对象中元素的数量可能不同(本例是6),即使同一个Vector对象在不同时刻也可能含有不同数量的元素(见4.2.3节)。不过,Vector对象本身的大小永远保持不变。这是C++语言处理可变数量信息的一项基本技术:一个固定大小的句柄指向位于“别处”(如通过new分配的自由存储,见4.2.2节)的一组可变数量的数据。第4章的主题就是学习如何设计并使用这样的对象。
在这里,我们只能通过Vector的接口访问其表示形式(成员elem和sz)。Vector的接口是由其public成员构成的,包括Vector()、operator[]()和size()。2.2节的read_and_sum()示例可简化为:

89f6854538fad910feb0d35b34f2b159b921d5a8

与所属类同名的“函数”称为构造函数(constructor),即它是用来构造类的对象的。因此构造函数Vector()替换了2.2节的vector_init()。构造函数有一个特性与普通函数不同,它确保只用于初始化类的对象,因此定义一个构造函数可以解决类变量未初始化问题。
Vector(int)规定了Vector对象的构造方式,此处意味着需要一个整数来构造对象,这个整数用于指定元素的数量。该构造函数使用成员初始值列表来初始化Vector的成员:

<a href=https://yqfile.alicdn.com/987afcf53bd67ae6bcf41f2fd2c44518f87628e4.png
" >

这条语句的含义是:首先从自由存储获取s个double类型的元素,用一个指向这些元素的指针初始化elem;然后使用s初始化sz。
访问元素的功能是由一个下标函数提供的,它叫做operator[],它的返回值是元素的引用(double&)。
size()函数的作用是向使用者提供元素的数量。
显然,在上面的代码中完全没有涉及错误处理,与之有关的内容将在3.4节提及。同样我们也没有提供一种机制来“归还”通过new获取的double数组,4.2.2节将介绍如何使用析构函数来完成这一任务。
我们常用的两个关键字struct和class没有本质区别,唯一的不同是struct的成员默认是public的。例如,我们也可以为struct定义构造函数和其他成员函数,这一点与class完全一致。
相关文章
存储 编译器 Linux
13 0
|
1天前
|
编译器 C++
标准库中的string类(上)——“C++”
标准库中的string类(上)——“C++”
|
1天前
|
编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(中)——“C++”
|
1天前
|
存储 编译器 C++
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
自从学了C++之后,小雅兰就有对象了!!!(类与对象)(上)——“C++”
|
1天前
|
缓存 编译器 API
NumPy与其他语言(如C/C++)的接口实践
【4月更文挑战第17天】本文介绍了NumPy与C/C++的接口实践,包括Python与C/C++交互基础、NumPy的C API和Cython的使用。通过案例展示了如何将C++函数与NumPy数组结合,强调了内存管理、类型匹配、错误处理和性能优化的最佳实践。掌握这些技能对于跨语言交互和集成至关重要。
|
2天前
|
C++
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
【C++成长记】C++入门 | 类和对象(下) |Static成员、 友元
|
2天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
【C++成长记】C++入门 | 类和对象(中) |拷贝构造函数、赋值运算符重载、const成员函数、 取地址及const取地址操作符重载
|
10天前
|
程序员 C++
C++语言模板学习应用案例
C++模板实现通用代码,以适应多种数据类型。示例展示了一个计算两数之和的模板函数`add&lt;T&gt;`,可处理整数和浮点数。在`main`函数中,展示了对`add`模板的调用,分别计算整数和浮点数的和,输出结果。
10 2
|
11天前
|
存储 算法 C语言
【C++初阶】8. STL初阶 + String类
【C++初阶】8. STL初阶 + String类
47 1
|
11天前
|
C语言 C++
【C++初阶】9. string类的模拟实现
【C++初阶】9. string类的模拟实现
36 1