C++PrimerPlus第十章学习笔记——对象和类

2024-04-09 14:08

本文主要是介绍C++PrimerPlus第十章学习笔记——对象和类,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

此文为本人学习所做一些记录,仅做个人学习之用,加入了我的理解,如发现错误欢迎指正,邮箱:lujialun99 A T gmail.com

过程性编程和面向对象编程(OOP)

  • 过程性编程首先要考虑要遵循的步骤,然后考虑如何表示这些数据。
  • OOP首先考虑数据,如何表示数据,如何使用数据

采用OOP时,首先从用户角度考虑对象——描述对象所需的数据以及描述用户与数据交互所需的操作,完成对接口的描述后,需要确定如何实现接口和数据存储,最后使用新的设计方案创建出程序。

抽象和类

抽象是把现实的对象属性转化成数据映射到类上,抽象是通往用户定义类型的捷径,用户定义类型指的是实现抽象接口的类设计。

类型是什么

基本类型完成了以下三项工作:
- 决定数据对象所占的内存
- 决定如何解释内存中的位(long和float占的位数相同解释不同)
- 决定可使用数据对象执行的操作或方法

内置类型有关的操作信息已经被内置到编译器中了,而自定义的类型则必须自己提供这些类型。

C++中的类

类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。一个规范的类由两个部分组成:

  1. 类声明:以数据成员的方式描述数据部分,以成员函数(方法)的方式描述公共接口。——蓝图
  2. 类方法定义:描述如何实现类成员函数。——细节

接口是什么

接口是一个共享框架,供两个系统交互时使用。对于类而言,我们叫公共接口,public是使用类的程序,交互系统由类对象组成,而接口由编写类的人提供的方法组成。接口让程序员能够编写与类对象交互的代码,从而让程序能够使用类对象。

C++程序员将接口(类定义)放在头文件中,将实现放在源代码文件中。

//类声明示例
// stock00.h -- Stock class interface
// version 00
#ifndef STOCK00_H_
#define STOCK00_H_#include <string>  class Stock  // class declaration
{
private: std::string company;long shares;double share_val;double total_val;void set_tot() { total_val = shares * share_val; }
public:void acquire(const std::string & co, long n, double pr);void buy(long num, double price);void sell(long num, double price);void update(double price);void show();
};    // note semicolon at the end#endif

访问控制

  • public:使用类对象的程序都可以直接访问,提供了程序和对象的接口
  • private:默认访问控制,只能通过公有成员函数或友元函数访问,这叫数据隐藏
  • protected:跟继承有关,13章讨论

类设计尽可能将公有接口与实现细节分开。公有接口表示设计的抽象组件。将实现细节放在一起并将它们与抽象分开被称为封装。数据隐藏是一种封装;将类函数定义和类声明放在不同的文件中是另一种封装。

数据隐藏不仅可以防止直接访问数据,还让开发者(类的用户)无需了解数据是如何被表示的。修改时直接对实现细节进行修改而无需修改程序接口,这是程序维护起来更容易。

实现类成员函数

  • 定义成员函数时,使用作用域解析运算符(::)来标识函数所属的类;
  • 类方法可以访问类的private组件
void Stock::update(double price)

内联方法

定义位于类声明中的函数都将自动成为内联方法,比如上面的Stock::set_tot()。类声明常将短小的成员函数作为内联函数。

也可以在类声明之外定义内联函数,只需要在实现方法的时候在前面加上inline即可,这种方式与前面的方式等价。

内联函数要求每个使用它们得文件都对其进行定义,所以直接将内联定义放在定义类的头文件中是最简单的方法。

对象与方法调用

每个新对象都有自己的存储空间,用于存储其内部变量和类成员;但同一个类的所有对象共享同一组方法,即每种方法只有一个副本。在OOP中,调用成员函数被称为发送消息。

Markdown

小结

类设计的第一步是提供类声明。类声明类似结构声明,可以包括数据成员和函数成员。声明为私有部分的成员只能通过成员函数访问,声明为共有部分的成员可被使用类对象的程序直接访问。通常数据成员放在私有部分,成员函数放在公有部分。

公有部分的内容构成了设计的抽象部分——抽象接口。将数据封装到私有部分中可以保护数据的完整性,这被称为数据隐藏。C++

类设计的第二步是实现类成员函数。

类的构造函数和析构函数

构造函数

构造函数名称与类名相同,没有返回值和返回类型,专门用于构造新对象,将值赋给它们的数据成员。

//下面是一个例子,还使用了默认值
Stock::Stock(const std::string & co, long n=0, double pr=0.0)

注意:构造函数的参数名不要与类的成员变量名同名,否则会造成混乱。

构造函数有两种方式来初始化对象,第一种方式是显示地调用构造函数:

Stock food = Stock("World Cabbge",250,1.25);

另一种是隐式地调用构造函数:

Stock food("World Cabbge",250,1.25);

使用new时也要调用:

Stock *p=new Stock("World Cabbge",250,1.25);

默认构造函数

如果没有提供构造函数,C++将自动提供默认构造函数。如:

Stock stock(){ }

默认构造函数无参数,因为声明中无值。如果定义了非默认构造函数,还想在程序中使用默认构造函数,则必须显示提供默认构造函数。

定义默认构造函数有两种:
1. 给已有默认构造函数提供所有参数提供默认值
2. 构造一个没有参数的构造函数

隐式地调用默认构造函数时不要使用圆括号。

析构函数

如果创建的是静态存储类对象,则其析构函数将在程序结束时自动被调用;

如果创建的是自动存储类对象,则其析构函数将在程序执行玩代码块时自动被调用。

如果对象是通过new创建的,则它将驻留在栈内存或自由存储区中,当使用delete来释放内存时,则其析构函数将自动被调用。

如果构造函数使用了new,则必须提供使用delete的析构函数。

成员函数

为了保证函数不会修改调用对象,C++的解决方法是将const关键字放在括号后面:

void show() const;

只要类方法不修改调用对象,就应将其声明为const。

this指针

this指针指向用来调用成员函数的对象(this被作为隐藏参数传递给方法),所有类方法都将this设置为调用它的对象的地址。如果方法需要调用整个对象,则可以用表达式*this。

此处省略了一大段内容。

对象数组

对象数组用来创建同一个类的多个对象。

Stock mybuffer[3]={Stock("Name",12.5 20),Stock("Nam",13 21),Stock("Na",14.5 21)
};

初始化对象数组的方案是,首先使用默认构造函数创建数组元素,然后花括号中的构造函数将创建临时对象,然后将临时对象的内容复制到相应的元素中。因此,要创建类对象数组,这个类必须有默认构造函数。

类作用域

在类中定义的名称作用域为整个类。定义类成员函数时必须使用作用域解析符::


void Stock::update(double price)
{
···
}

作用域为类的常量

下面这种创建常量的方法是错误的:

class Stock
{
private:const int a=3;int b[a];
}

因为声明类知识描述了对象的形式,并没有创建对象,因此在创建对象之前,将没有用于存储至的空间。

下面这两种方法适用于所有情况:

  1. 枚举,枚举符号只是一个符号
  2. static,静态变量存储在静态区而不是存储在对象中

作用域内枚举

传统枚举定义的枚举可能发生冲突:

enum a{Xiaohong,Xiaoming};enum b{Xiaohong,Xiaoming};

C++11提供作用域为类的枚举。

enum class a{Xiaohong,Xiaoming};enum class b{Xiaohong,Xiaoming};

使用时用枚举名来限定枚举量:

a A = a::Xiaohong;
b B = b::Xiaohong;enum class b{Xiaohong,Xiaoming};

C++11枚举类型不能隐式转换为整型,必须强制转换。

抽象数据类型(简述)

抽象数据类型(abstract data type,ADT)以通用方式描述数据类型,而没有引入语言实现细节。公有成员函数接口提供了ADT描述的服务,类的私有部分和类方法的代码提供了实现,这些实现了对客户的隐藏。

这篇关于C++PrimerPlus第十章学习笔记——对象和类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/888358

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]