C++primer(第五版)第七章(类)

news2024/11/18 1:35:03

类的基本思想是数据抽象和封装.

数据抽象是一种依赖于接口和实现的分离的编程技术.

封装实现了类的接口和实现的分离.

7.1定义抽象数据类型

定义一个抽象数据类型使用关键字struct或是clas(差别仅在于默认访问权限修饰符).

//这是一个简单的类定义
class Student{                      //类名叫Student
    string name;                    //string类型的成员变量name
    void sayHello(){                //返回值为vod的成员函数sayHello
        std::cout<<"hello"<<std::endl;
    }
}

定义在类内部的函数是隐式的inline函数(内联函数,前一章有简单介绍).所有成员都必须在类的内部声明,不过成员函数的函数体可以在类外定义,但是要表明所属的类,因为类本身就是一个作用域.并且在类外定义成员函数必须与类内的声明一致(返回类型,参数列表,函数名)

 如上例子就是将成员函数sayHello声明在了类内,但是函数体定义在了类外.请暂时忽略掉类中的public关键字.先注意类外怎么定义函数体,首先是函数的返回值,然后是类名加上两个冒号::,然后是函数名和参数列表.

类中的成员函数可以使用名为this的额外的隐式参数来访问调用它的那个对象.

 如上例子,在成员函数sayHello中使用了this->name访问到了成员变量name,main函数中s调用成员函数sayHello,函数体内的this就是指向s的指针.

若是在成员函数的声明后加上const关键字,那么该成员函数被称为常量成员函数.作用是修改隐式this指针的类型,默认情况下this的类型是指向类类型非常量版本的常量指针(有点绕),加上关键字const后的成员函数内的this指针是一个指向常量的指针,简单来说在常量成员函数中不能修改任何成员变量.如下例子,加上const修饰成员函数后就不能再修改成员变量了.

 类通过一个或几个特殊成员函数来控制其对象的初始化过程,这些函数被称为构造函数,无论何时只要类的对象被创建,就会执行构造函数.

构造函数可以重载.

构造函数没有返回值.

构造函数可以在类外定义.

如果没有定义任何一个构造函数,那么编译器会隐式地定义一个默认构造函数,默认构造函数无需任何实参,该默认构造函数按照以下规则进行初始化:

1,如果存在类内初始值,那么会用类内初始值来初始化成员

2,否则按照类型的默认值来初始化.

如果我们定义了一个有参数的构造函数,但是又想要默认构造函数(如果有定义构造函数,那么编译器不生成默认构造函数),可以在参数列表后加上=default,例如:

#include <iostream>
using namespace std;
class Student {
    string name="张三";
    int age = 0;
public:
    Student(string name) {    //构造函数重载
        this->name = name;
    }
    Student(int age) {        //构造函数重载
        this->age = age;
    }
    Student(string n, int a) :name(n), age(a) {    //构造函数重载
        cout << "hello world" << endl;
    }
    Student() = default;    //使用默认构造函数
};

我们可以从上面的例子看到第三个构造函数和其他的构造函数不太一样,参数列表后面跟着的是构造函数初始值列表,可以直接给成员变量初始化赋值.

7.2访问控制与封装

C++中通过访问说明符加强类的封装性.(参考上面的代码)

public说明符后的成员可以在整个程序类访问.

private说明符后的成员仅能被类内的成员函数访问.

class和struct定义的抽象数据类型唯一的区别在于默认访问权限不一样.class默认是private,而struct默认是public.

类可以允许其他类或者函数访问它的非公有成员(private),只需要将其变成类的友元,只需增加以friend关键字开始的函数声明语句(不能代替函数的声明).友元声明只能写在类内最好是集中写在类的开头或结尾.

#include <iostream>
using namespace std;
class Student {

friend void sayHello(Student s);    //意为函数sayHello可以访问本类的私有成员(private)

private:
    string name="张三";
    int age = 0;
public:
    Student(string n, int a) :name(n), age(a) {
        cout << "hello world" << endl;
    }
};

7.3类的其他特性

成员函数也可以重载,只要满足条件就可以(函数同名,参数列表不一样)

之前说过const修饰的成员函数(常量成员函数)不能修改成员变量,但是如果在定义成员变量的时候在开头加上mutable关键字就可以对其进行修改.mutable修饰的变量称为可变数据成员.

即是两个类的成员列表完全一直,但它们也是不同的类型.

如果指定一个类为友元类,那么那个友元类内的所有成员函数都可以访问私有成员,如果要指定某个类的成员函数为友元函数,那么需要指出该成员函数为哪个类的成员函数.

声明友元函数时,若函数为重载函数,那么尽管函数名一样,但仍需要一个个单独声明友元.

7.4类的作用域

一个类就是一个作用域.

编译器处理完类中的全部声明后才会处理成员函数的定义,所以类外定义的成员函数,需要在声明之后.

一般来说,不建议使用成员的名字作为某个成员函数的参数名.

7.5构造函数再探

如果成员const,引用,或者属于某种未提供默认构造函数的类类型,那么我们必须通过构造函数初始值列表为这些成员提供初值.

最好让构造函数初始值的顺序与成员声明的顺序保持一致.尽量避免使用某些成员初始化其他成员.

C++11新标准使得可以定义委托构造函数,委托构造函数使用它所属类的其他构造函数执行它自己的初始化过程. 

7.6类的静态成员

在成员的声明前加上关键字static则将其变为静态成员,所有类的对象共享一个静态成员.

当我们指向类外部的静态成员时,必须指明成员所属的类名.static关键字只出现在类内部的声明语句中.

通常情况下,类的静态成员不应该在类的内部初始化.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/707095.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 结合 opencv读取图片与视频

C 结合 opencv读取图片与视频 文章目录 C 结合 opencv读取图片与视频一、安装opencv二 、配置文件准备2.1 新建立文件夹2.2 .vscode文件下配置文件&#xff08;1&#xff09;配置tasks.json文件&#xff08;1&#xff09;配置launch.json 三 、src文件下代码编写3.1 图片的读取…

matplotlib设置坐标轴为象限模式

import numpy as np import matplotlib.pyplot as pltx np.linspace(-np.pi, np.pi, 1000) cosy np.cos(x) siny np.sin(x)plt.xlim(min(x), max(x)) plt.ylim(min(cosy), max(cosy)0.5) plt.plot(x, cosy) plt.plot(x, siny) # 设置坐标刻度 plt.xticks([-np.pi, -np.pi/2,…

ubuntu安装python

ubuntu安装python 安装包下载 切换到想要的文件夹&#xff1a;如 cd /usr/local/python3 下载安装包 wget https://www.python.org/ftp/python/3.8.10/Python-3.8.10.tgz 网速慢的话也可以现在本电脑下载tgz文件&#xff0c;然后上传到服务器 第一次上传失败&#xff01; Py…

SFP3012A-ASEMI代理海矽美快恢复二极管SFP3012A

编辑&#xff1a;ll SFP3012A-ASEMI代理海矽美快恢复二极管SFP3012A 型号&#xff1a;SFP3012A 品牌&#xff1a;MHCHXM&#xff08;海矽美&#xff09; 芯片个数&#xff1a;单芯片 封装&#xff1a;TO-247 恢复时间&#xff1a;≤75ns 工作温度&#xff1a;-40C~175C …

JS中的异步与Promise使用

同步与异步 我们知道JS是一个单线程的语言&#xff0c;即在同一时间只能做一件事情。为什么设计为当线程呢。&#xff1f;在早期JS是为了在浏览器中运行&#xff0c;我们可以利用JS来制作一些页面的效果也可以和用户做一些交互。所以设计为单线程也是为了避免复杂度。比如在网…

常见面试题之线程中并发锁(一)

1. 讲一下synchronized关键字的底层原理&#xff1f; 1.1. 基本使用 如下抢票的代码&#xff0c;如果不加锁&#xff0c;就会出现超卖或者一张票卖给多个人 Synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】&#xff0c;其它线程再想获取这…

常州工学院计算机组成原理(样卷)

微程序控制器&#xff1a;仿照程序设计的基本方法&#xff0c;将实现指令系统中所有指令所需要的所有控制信号按照一定的规则编码成微指令&#xff0c;若干条实现同一条指令功能的微指令构成一段微程序&#xff0c;将实现所有指令的微程序存放在一个只读存储器ROM中&#xff0c…

一套A股量化系统

shares A 股量化交易系统后台开发语言 Go/Python gmsec算法使用&#xff1a;pytorch全链路量化&#xff0c;行业板块分析&#xff0c;直接贴图。欢迎体验

【计算机视觉】最新综述:南洋理工和上海AI Lab提出基于Transformer的视觉分割综述

文章目录 一、导读二、摘要三、内容解读3.1 研究动机3.2 这篇综述的特色&#xff0c;以及与以往的Transformer综述有什么区别&#xff1f;3.3 Transformer-Based 分割和检测方法总结与对比3.4 相关研究领域的方法总结与对比3.5 不同方法的实验结果对比3.6 未来可以进行的方向 一…

vue三种方式导出报表至excel

1、序言 1.1、源码 源码在下方&#xff0c;复制运行&#xff0c;安装相应的插件即可 1.2、坑 方式一、方式二安装相同插件&#xff1a; npm install xlsx xlsx-style file-saver 导入 xlsx-style 会报如下的错误 解决办法&#xff1a; &#xff08;1&#xff09;去node_modules…

多元回归预测 | Matlab基于灰狼算法(GWO)优化混合核极限学习机HKELM回归预测, GWO-HKELM数据回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于灰狼算法(GWO)优化混合核极限学习机HKELM回归预测, GWO-HKELM数据回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 …

基于matlab使用深度学习估计身体姿势(附源码)

一、前言 此示例演示如何使用 OpenPose 算法和预训练网络估计一个或多个人的身体姿势。 身体姿势估计的目标是识别图像中人的位置及其身体部位的方向。当场景中存在多个人时&#xff0c;由于遮挡、身体接触和相似身体部位的接近&#xff0c;姿势估计可能会更加困难。 有两种…

【手撕算法|动态规划系列No.1】leetcode1137. 第 N 个泰波那契数

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

【C/C++】数组指针:array 地址 array *parray 两次解引用 **parray 值相同的原因解析

一、提出问题 #include <stdio.h>int main() { char array[16] {A, B}; char (*parray)[16] &array; printf("\n");printf(" array: \t%#lx\n", array); printf("& array: \t%#lx\n", &array); printf("…

SQL server 2012 配置数据库邮件实现邮件发送

日常开发中经常遇到邮件推送场景&#xff0c;我们可以利用SQL server也可以实现邮件发送功能。 一、配置邮件服务器 然后再弹出的页面中选择下一步 输入配置文件名&#xff0c;并添加新用户 在弹出的页面配置邮件服务器的地址、用户名、密码等相关信息 以上信息完成&#xff0…

树莓派 Raspberry Pi Zero 2W 安装默认系统时 ssh 登录并开启摄像头推流一段时间B

Raspberry Pi Zero 2W有点鸡肋&#xff0c;hdmi口用的microhdmi口&#xff0c;不是树莓派4b的minihdmi口&#xff0c;然后zero 2W也没有usb接口&#xff0c;有一个microusb安卓的otg接口&#xff0c;很烦&#xff0c;还好有wifi蓝牙模块&#xff0c;这样子还能ssh&#xff0c;不…

【冒泡排序】

前言 在计算机科学中&#xff0c;排序算法是一种常见且重要的算法。排序算法的目标是将一组无序的数据按照一定的规则进行重新排列&#xff0c;以便更方便地进行搜索、查找或其他操作。 冒泡排序&#xff08;Bubble Sort&#xff09;是最简单的排序算法之一&#xff0c;它的原…

基于Python+MySQL所写的商城管理系统

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87971437?spm1001.2014.3001.5503 《51商城》程序使用说明 51商城项目分为网站前台和后台两个部分&#xff0c;下面将分别介绍这2个部分的使用。 1.网站前台 在虚拟环境中启动程序后&a…