《C++ Primer Plus》第10章 对象和类
第10章 对象和类
过程性编程和面向对象编程
采用过程性编程方法时,首先考虑要遵循的步骤,然后考虑如何表示这些数据。
采用面向对象编程方法时,首先从用户的角度考虑对象——描述对象所需的数据及描述用户与数据交互所需的操作。完成对接口的描述后,需要确定如何实现接口和数据存储。最后,使用新的设计方案创建出程序。
抽象和类
类规范由两个部分组成,即类声明和类方法定义。类声明以数据成员的方式描述数据部分,以成员函数(方法)的方式描述公有接口。类方法定义描述如何实现类成员函数。
通常将接口(类定义)放在头文件中,将实现(类方法的代码)放在源代码文件中。
使用类对象的程序都可以访问类的公有部分,但只能通过公有成员函数(或友元函数)访问对象的私有成员。
定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类。
类方法可以访问类的private组件。
类中其他成员函数使用类方法无需作用域解析运算符。
定义位于类声明中的函数都将自动成为内联函数,类声明常将短小的成员函数作为内联函数。
声明类变量以创建对象,并通过成员运算符(.)使用对象的成员函数。调用成员函数时,它将使用被用来调用它的对象的数据成员。
类的构造函数和析构函数
构造函数名称与类名相同,且没有声明类型。
构造函数参数名不能与类成员相同。
使用构造函数来初始化对象有显式调用构造函数和隐式调用构造函数两种。
无法使用对象来调用构造函数,因为在构造函数构造出对象之前,对象是不存在的。
默认构造函数时在未显式提供初始值时用来创建对象的构造函数。如果没有提供任何的构造函数,则C++将自动提供默认构造函数。
如果提供了非默认构造函数,则必须定义一个不接受任何参数的默认构造函数以创建不显示初始化的对象。
定义默认构造函数有两种方式,一种是给已有的构造函数的所有参数提供默认值,另一种方式是通过函数重载来定义一个没有参数的构造函数。
默认构造函数只能有一个,所以以上两种方式只能采用一种。在设计类时,通常应提供对所有类成员做隐式初始化的默认构造函数。
析构函数的名称为在类名前加上~,析构函数没有参数。
通常不应该在代码中显式调用析构函数。
可以将一个对象赋给同类型的另一个对象。
构造函数可以初始化新对象,也可以对已经存在的对象进行赋值。
可以将列表初始语法用于类。
将const关键字放在函数括号后面,可以声明和定义const成员函数。只要类方法不修改调用对象,就应将其声明为const。
如果构造函数使用了new,则必须提供使用delete的析构函数。
this指针
this指针指向用来调用成员函数的对象。
对象数组
要创建同一个类的多个对象,可以创建对象数组。声明对象数组的方法与声明标准类型数组相同。
类作用域
在类中定义的名称的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。因此,可以在不同类中使用相同的类成员名而不会引起冲突。
类作用域意味着不能从外部直接访问类成员,公有成员函数也是如此。要调用公有成员函数,必须通过对象。
声明类只是描述了对象的形式,并没有创建对象,即在创建对象前,将没有用于存储值的空间。因此无法通过在类声明中创建常量使其由所有对象共享。
可以在类中声明一个枚举,并用枚举为整型常量提供作用域为整个类的符号名称。还可以使用关键字static。
抽象数据类型
抽象数据类型(abstract data type,ADT)以通用的方式描述数据类型,而没有引入语言实现细节。类概念非常适合于ADT方法。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)