当前位置: 首页 > news >正文

《C++ primer plus》精炼(OOP部分)——对象和类(2)

“学习是人类成长的喷泉。” - 亚里士多德

文章目录

  • 内联函数
  • 对象的方法和属性
  • 构造函数和析构函数
    • 构造函数的种类
    • 使用构造函数
    • 析构函数
    • 列表初始化
  • const成员函数
  • this指针
  • 对象数组
  • 类作用域
    • 作用域为类的常量
    • 类作用域内的枚举

内联函数

定义位于类声明中的函数自动成为内联函数。有两种方法可以成为内联函数:

  1. 将函数定义置于类声明。
  2. 在类定义中加上inline关键字。

注意,只有足够短小的函数才能被当作内联函数处理。当一个函数被定义为内联函数时,编译器在调用这个函数不会真正进入到这个函数中,而是直接用函数体来替换函数名进行处理,这样就省去了进入函数所花费到时间开销;但因为这种处理方式需要编译器对代码重新进行编译,所以只有足够简单的函数才能作为内联函数。上一篇文章中的set_tot()函数就是内联函数。

对象的方法和属性

系统为每一个对象分配一块存储空间,这个空间内分配着这个对象的属性值,但方法并不存在这块空间中,作为所有对象的公用代码段,它单独存在一块空间中并被所有对象一起调用。详细解释将留给下文,现在只需知道方法和属性不共同存储在一个地方即可。

构造函数和析构函数

为了让对象在构建的时候顺便完成指定的行为,比如打印提示语或进行属性变量的初始化,我们可以自己在类中写构造函数。
构造函数在构造对象时自动调用,一个类中必须有构造函数,如果程序员没有自己编写,编译器会帮程序员加上一个默认构造函数:

class Stock
{//编译器默认添加的构造函数Stock(){};
};

构造函数有两个特征:

  1. 函数名与类相同
  2. 没有返回值

构造函数的种类

构造函数可分为三类:

  1. 默认构造函数,即编译器自动加的函数。
  2. 带参数的构造函数:顾名思义,带有参数。
class Stock
{int i_;//沿用书中的命名习惯,在属性最后加一个下划线//带有参数的构造函数Stock(int i){i_=i;//可以像普通函数一样使用传入的参数};//可以写不止一个构造函数,也就是构造函数重载Stock(float i){cout<<i;//这次没有用参数初始化,而是直接打印了}
};
  1. 拷贝构造函数:传入一个该类的对象作为参数。
class Stock{int i_;//以一个该类(Stock类)的对象作为参数Stock(Stock s){i_=s.i_;//利用.运算符调用所传入对象的属性进行初始化cout<<s.i_;//当然也可以打印}
}

在编写构造函数时,如果想编写第二种和第三种构造函数,则必须先编写默认构造函数,且此时编译器不会自动提供默认构造函数。
注意,给构造函数传参时,不要让参数名和属性变量名一致,这个原则和使用普通函数一样(这个错误对于新手来说真的很隐蔽而易犯!)

使用构造函数

C++有两种使用构造函数的方式:

int main(void){//第一种,通过显式调用来使用构造函数Stock food=Stock(42);//第二种,隐式调用构造函数Stock food2(42);//和上面的第一种调用等价//注意,如果想隐式调用默认构造函数,不能加圆括号Stock food3;//隐式调用默认构造函数return 0;
}

注意,第二种调用方法是构造函数独有的,其他方法不能用这种方式。
构造函数也可以在赋值时使用:

int main(void){//利用构造函数进行初始化Stock food=Stock(42);//利用构造函数进行赋值food=Stock(42);
}

析构函数

析构函数比构造函数简单的多,它负责告诉编译器这个对象已经使用完毕,可以被回收。唯一值得一提的是,构造函数也可以在函数体中进行一些操作。

class Stock{int i;~Stock()//虽然要对所有属性变量进行回收,但函数体中不应有对属性变量的删除操作,编译器会自动回收{cout<<"this stock is destroy!"//可以进行打印cout<<i;//可以使用属性变量}
}

析构函数特点和构造函数相同,它的名字是类名前加一个~。
在代码中,程序员不显式调用析构函数,什么时候调用析构函数由编译器自己决定。

列表初始化

这实际上是C++11中引入的另一种隐式调用构造函数的方式。尽管方便,但笔者并不习惯使用,只能说仁者见仁吧。

int main(void)
{//隐式调用带参数的构造函数,注意要使用大括号Stock hot_tip={42};//隐式调用默认构造函数Stock hot_tip1{};
}

const成员函数

当一个函数已经被程序员确认不会修改调用它的对象时,应该把它声明为const成员函数。当一个函数被声明为const成员函数时,编译器将知道这个函数不会修改对象,这将提升代码的可读性并规避一些令人迷惑的错误。

this指针

this指针指向调用这个指针的对象本身,函数传入另一个对象时,这个指针会派上用场:

class Stock{int i;Stock larger(Stock& s){if(i>=s.i)return s;//第一个i是调用这个函数的对象的属性i,因此可以写成this->ielse return *this;//this是指向对象的指针,因此*this就是这个对象本身}
}

对象数组

和默认类型一样,对象也可以以数组的形式同时声明多个:

class Stock{int i;Stock();//默认构造函数Stock(int s);//带参数的构造函数}
int main(void)
{int a[3]={3,2,1}这是int类型声明数组的方式,Stock对象数组大同小异Stock s1[3]={Stock(),//第一个对象使用默认构造函数Stock(3),//第二个对象使用带参数构造函数Stock(),//第三个对象使用默认构造函数};
}

对象数组进行初始化时,首先使用默认构造函数创建数组元素,然后再用大括号中的构造函数创建临时对象,最后将临时对象复制进数组元素中。

类作用域

在C++中,类的成员作用域都为该类,在类外使用这个类的成员时,需要加上直接成员运算符(.),间接成员运算符(->)或作用域解析运算符(::):

class Stock{int i;Stock();//默认构造函数Stock(int s);//带参数的构造函数void show();}
//下面的函数是show方法的定义
Stock::show(){...};//::为作用域解析运算符
int main(void)
{Stock s;s.show();//.为直接成员运算符Stock* sp=s;sp->show();//->为间接成员运算符
}

只需要知道类中的成员在类外使用时不能直接用,要加点什么就可以了。至于应该加什么,代码写多了自然就可以自己辨别。

作用域为类的常量

有些常量由类的所有对象共享,这种常量可以用来表示所有对象都需要共同维护的一个信息。有两种方式声明这种变量,枚举和static关键字:

class Stock{enum{Months=12}//使用枚举的方法声明常量static const int date=30;//使用static的方法声明常量

类作用域内的枚举

传统的枚举在同一个作用域中会有冲突:

enum egg{small,medium,large};
enum t_shirt{small,medium,large};

这种情况下无法通过编译,但如果使用类作用域的枚举,就可以解决这个问题:

enum class egg{small,medium,large};
enum class t_shirt{small,medium,large};

使用枚举量时要用::运算符:

egg e=egg::small;

但要注意,枚举量并非int类型,不能进行隐式类型转换,但显式类型转换也是允许的:

int i=egg::large;//不能通过编译
int a=(int)egg::large;//可以通过编译

枚举量的底层类型未知,取决于实现,但依然可以使用以下语法指定底层类型(在short,int等整型类型中指定):

enum class : short pizza{small,medium,large};//在class后加:short

请添加图片描述
我是霜_哀,在算法之路上努力前行的一位萌新,感谢你的阅读!如果觉得好的话,可以关注一下,我会在将来带来更多更全面的知识讲解!

相关文章:

《C++ primer plus》精炼(OOP部分)——对象和类(2)

“学习是人类成长的喷泉。” - 亚里士多德 文章目录 内联函数对象的方法和属性构造函数和析构函数构造函数的种类使用构造函数析构函数列表初始化 const成员函数this指针对象数组类作用域作用域为类的常量类作用域内的枚举 内联函数 定义位于类声明中的函数自动成为内联函数。…...

一点感受

做了两天企业数字化转型的评委&#xff0c;涉及全国最顶级的公司、最顶级的实际落地项目案例&#xff0c;由企业真实的落地团队亲自当面讲解。主要是为了了解了解真实的一线、真实的客户、真实的应用现状和应用水平。 &#xff08;1&#xff09;现状 我评审的涉及底层技术平台&…...

VirtualBox RockyLinux9 网络连接

有几次都是隔一段时间之后启动虚拟机&#xff0c;用第三方ssh工具就连接不上了。 简单记录一下。 1、VirtualBox设置 2、IP设置 cd /etc/NetworkManager/system-connections/ vim enp0s3.nmconnection[connection] idenp0s3 uuid9c404b41-4636-397c-8feb-5c2ed38ef404 typeet…...

java 实现适配器模式

适配器模式&#xff08;Adapter Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将一个类的接口转换成另一个类的接口&#xff0c;使得原本不兼容的类可以协同工作。适配器模式包括两种类型&#xff1a;类适配器和对象适配器。下面分别介绍这两种类型的实现方式。 类…...

后端常用的Linux命令大全

后端常用的Linux命令大全 基础常用命令 Sudo Command 该命令是“superuser do”的缩写。sudo 是最常用的命令之一&#xff0c;可让你执行需要管理或 root 特权和权限的任务。 使用sudo命令时系统会提示用户重新使用密码进行身份验证。接下来&#xff0c;Linux 系统将记录一…...

C++面向对象

C面向对象知识 内存字节对齐 #pragma pack(n) 表示的是设置n字节对齐,windows默认是8字节&#xff0c;linux是4字节&#xff0c;鲲鹏是4字节 struct A{char a;int b;short c; };char占一个字节&#xff0c;起始偏移为零&#xff0c;int占四个字节&#xff0c;min(8,4)4&#x…...

什么是栈顶缓存技术

假设有一个基于流水线架构的处理器&#xff0c;它需要执行一系列指令。这些指令包括加载数据、执行计算和存储结果。在流水线中&#xff0c;不同阶段的指令可以并行执行。 现在考虑一个简单的情况&#xff0c;其中需要执行以下两个指令&#xff1a; 加载数据指令&#xff1a;…...

TDesign的input标签

目录 一、 新建页面01-todolist 二、 t-input标签、t-button标签 2.1 t-input标签 2.1.1 01-todolist.wxml页面 2.2 01-todolist.json页面 2.3 01-todolist.js页面 2.4 01-todolist.wxss页面 2.2 t-button标签 示例1&#xff1a;bind:change 示例2&#xff1a;bind:…...

从零开始学习 Java:简单易懂的入门指南之Map集合(二十三)

Map集合 1.Map集合1.1Map集合概述和特点1.2Map集合的基本功能1.3Map集合的获取功能1.4Map集合的遍历(方式1)1.5Map集合的遍历(方式2) 2.HashMap集合2.1HashMap集合概述和特点2.2HashMap集合应用案例 3.TreeMap集合3.1TreeMap集合概述和特点3.2TreeMap集合应用案例 1.Map集合 1…...

SpringBoot 拦截org.thymeleaf.exceptions.TemplateInputException异常

SpringBoot 拦截thymeleaf异常 org.thymeleaf.exceptions.TemplateInputException异常 org.thymeleaf.exceptions.TemplateProcessingE xception: Could not parse as each: "message : xxx " (template: “xxxx” - line xx, col xx) thymeleaf异常复现 你是故意的…...

Qt之随机数

介绍使用qsrand和qrand生成随机数。 生成随机数 生成随机数主要用到了函数qsrand和qrand&#xff0c;qsrand用来设置种子点&#xff0c;该种子为qrand生成随机数的起始值。如果不调用qsrand,那么qrand()就会自动调用qsrand(1)&#xff0c;即系统默认将1作为随机数的起始值。使…...

UWB学习——day2

UWB应用 基于上文UWB学习——day1中对UWB技术的相关优势介绍&#xff0c;UWB技术可广泛应用于以下场景。 WPAN&#xff08;无线个域网&#xff09; 基于其高精度&#xff08;亚厘米级&#xff09;、低功耗和高穿透性等特征&#xff0c;在以人为基础的个域网中应用广泛&#…...

使用 multiprocessing 多进程处理批量数据

示例代码 import multiprocessingdef process_data(data):# 这里是处理单个数据的过程return data * 2# 待处理的数据 data [1, 2, 3, 4, 5]def normal_func():# 普通处理方式result []for obj in data:result.append(process_data(obj)return resultdef parallel_func():# …...

React 与 TS 结合使用时组件传参总结

在学习 React 时&#xff0c;我们总会遇到在 TS 和 JS 之间切换来开发多个项目&#xff0c;而有时会忘记 TS 的语法&#xff0c;所以编写一下 React 结合 TS 开发时的一些总结知识点&#xff0c;以便后续回顾用。 向组件传递基础参数&#xff08;字符串、数字和布尔值&#xf…...

性能炸裂c++20协程+iocp/epoll,超轻量高性能异步库开发实战

前言&#xff1a; c20出来有一段时间了。其中一大功能就是终于支持协程了&#xff08;c作为行业大哥大级别的语言&#xff0c;居然到C20才开始支持协程&#xff0c;我也是无力吐槽了&#xff0c;让多少人等了多少年&#xff0c;等了多少青春&#xff09;但千呼万唤他终于还是来…...

自定义Dynamics 365实施和发布业务解决方案 - 4. 自动化业务流程

本章的主要重点是研究拟议应用程序的关键业务流程的自动化。每个组织每天都有自己独特的业务操作,这些操作是业务的关键部分。有些自动化的业务流程不需要用户交互,有些流程需要用户交互。此外,在某些业务流程中,某些用户操作完成,然后触发自动化流程来完成业务流程。 Dy…...

Lua03——开发环境搭建

1 安装开发插件 在 idea 或 vscode 中安装 lua 的开发插件 EmmyLua 2 创建工程 在 idea 中创建一个新的工程 工程的类型选择 lua 输入工程名及目标目录 在工程结构的SDK中设置lua在本地安装目录 在工程结构的modules中选择 lua 3 编写第一个lua程序 在工程下添加程序包&#…...

Redis 非关系型数据库 配置与优化

关系数据库与非关系型数据库 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言&#x…...

docker笔记8:Docker网络

1.是什么 1.1 docker不启动&#xff0c;默认网络情况 ens33 lo virbr0 在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr0网卡&#xff1a;它还有一个固定的默认IP地址192.168.122…...

C# 共享项目的应用

概述 共享项目也可以称为共享资产项目,它允许在多个目标项目之间共享的代码。 它支持编译器指令,可以有条件地包含特定于平台的代码,以便编译为引用共享项目的项目的子集。 还有 IDE 支持,可帮助管理编译器指令并直观显示代码在每个应用程序中的外观。 什么是共享项目? …...

Linux之基于HTTPS的静态网站

目录 Linux之基于HTTPS的静态网站 定义 SSL协议 使用Apachemod_ssl组件的加密认证网站 mod_ssl模组 安装 配置文件 ssl配置文件的主要参数 案例 案例1 --- 搭建HTTPSSL的加密认证的web服务器 案例2 --- 组建多个子目录的网站www.joker.com&#xff0c;该网站下有2个子…...

ChatGPT在机器人护理和老年人支持中的潜在角色如何?

机器人在护理和老年人支持领域有着巨大的潜力&#xff0c;可以提供多种服务和支持&#xff0c;改善老年人的生活质量&#xff0c;并减轻护理工作者和家庭成员的负担。在这篇文章中&#xff0c;我将探讨机器人在这一领域的潜在角色&#xff0c;包括其应用、优势和挑战。 ## 1. …...

LeetCode:261. 以图判树 - Python

261. 以图判树 问题描述&#xff1a; 给定从 0 到 n-1 标号的 n 个结点&#xff0c;和一个无向边列表&#xff08;每条边以结点对来表示&#xff09;&#xff0c;请编写一个函数用来判断这些边是否能够形成一个合法有效的树结构。 示例 1&#xff1a; 输入&#xff1a;n 5, …...

Linux目录结构和远程使用

目录名作用根目录 ‘/’文件系统结构的起始点/root系统管理员的工作目录/home普通用户工作目录/bin存放二进制可执行文件&#xff0c;存放最经常使用的命令/sbin系统管理员使用的系统管理程序/boot启动linux时使用的一些核心文件/dev设备文件&#xff0c;包括块设备和字符设备/…...

淘宝销量展示方式变更背后的逻辑

淘宝销量展示方式发生了调整&#xff0c;平台于8月16日将商品详情销量展示表达由【月销**件】全部换成展示【已售**件】&#xff0c;将30天销量改成了近365天销量。 【已售**件】统计口径&#xff1a;统计近365天支付的商品件数&#xff0c;数据更新请关注24-48小时。其中涉及销…...

Bytebase 和 GitLab 签署 Technology Partner 技术合作伙伴协议

Bytebase 和 GitLab 签署技术合作伙伴协议&#xff0c;携手为开发者提供流畅的数据库协作开发和管理体验。 GitLab 是世界领先的开源 AI 驱动 DevSecOps 平台&#xff0c;旨在帮助开发者团队更好协作、更高效交付软件。Bytebase 是一款为 DevOps 团队准备的数据库 CI/CD 工具&a…...

杭州高职画室哪家好?如何选择高职画室?高职美术学习选哪家画室?

随着越来越多的画室开始涉足高职美术培训&#xff0c;根据杭州高职画室的美术学生及其家长所知&#xff0c;由于普通高中和高职联考之间存在巨大差异&#xff0c;因此许多普通高中的画室的高职班并未取得太大的成功。因此&#xff0c;小编为正在寻找画室的你提供介绍&#xff1…...

原型模式简介

概念&#xff1a; 原型模式 (Prototype Pattern)是一种创建型设计模式&#xff0c;它允许通过复制现有对象来创建新对象&#xff0c;而无需依赖于昂贵的实例化过程。该模式基于原型实例生成新的对象&#xff0c;并且可以根据需要进行修改和定制。 特点&#xff1a; 通过克隆…...

SpringMVC(一)

1.SpringMVC简介 1.1 什么是MVC MVC是一种软件架构的思想&#xff0c;将软件按照模型、视图、控制器来划分 M:Model,模型层&#xff0c;指工程中的JavaBean,作用是处理数据 JavaBean分为两类&#xff1a; 一类称为实体类Bean:专门存储业务逻辑的&#xff0c;如Student、Us…...

树的基本概念和存储结构

一、树的基本概念 1、树的定义 树是n&#xff08;n>0&#xff09;个结点的有限集。当n 0时&#xff0c;称为空树。在任意一棵非空树中应满足&#xff1a; 1、有且仅有一个特定的称为根的结点。 2、当n>1时&#xff0c;其余节点可分为m&#xff08;m>0&#xff09…...

网站建设合同审批/新闻最新消息今天

2018DOI: 10.19595/j.cnki.1000-6753.tces.L80178基于变周期递推最小二乘法与卡尔曼观测器的伺服系统在线惯量辨识杨明屈婉莹陈扬洋徐殿国(哈尔滨工业大学电气工程及自动化学院哈尔滨150001)摘要交流伺服系统运行过程中&#xff0c;系统参数的变化和外界干扰会影响系统性能。而…...

怎么做视频网站赚钱吗/河北seo基础入门教程

三数之和题目描述分析及函数部分代码题目描述 给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含…...

做软件赚钱还是做网站赚钱/百度推广开户费

一则声明 关于笔者文章中出现水印不一致的情况&#xff0c;有几个水印是我的历史名称&#xff0c;如樱花城堡小侍卫&#xff0c;水木樱城&#xff0c;水沐银橙&#xff0c;红尘映雪&#xff0c;量化橙同学&#xff0c;都是曾用名&#xff0c;对于以上水印的不存在抄袭现象&…...

有没有做婚车的网站/投稿网站

一直纠结如何爬取flash网站&#xff0c;偶尔在 github上看到了爬取的方法。有兴趣可以研究下。网站&#xff1a;中国农业信息网请求包分析Chales抓包截图请求image响应image代码如下# coding: utf-8# agri.gov.cn_amf_client.py# http://jgsb.agri.gov.cn/flexapps/hqApp.swf数…...

农业局网站建设方案/怎么做优化

前言 小程序开放了云开发能力&#xff0c;为开发者提供了一个可以很快速构建小程序后端服务的能力&#xff0c;作为一名对新技术不倒腾不快的前端&#xff0c;对此也是很感兴趣的&#xff1b; 而Taro 是凹凸实验室推出的&#xff0c;基于React 语法规范 的多端开发解决方案&a…...

wordpress登陆入口修改/合肥seo推广培训班

AtomicInteger的原理java的并发原子包里面提供了很多可以进行原子操作的类&#xff0c;比如&#xff1a;AtomicIntegerAtomicBooleanAtomicLongAtomicReference等等&#xff0c;一共分为四类&#xff1a;原子更新基本类型(3个)、原子更新数组、原子更新引用和原子更新属性(字段…...