C++:封装

封装:将数据和操作数据的方法进行结合, 隐藏具体的实现细节, 只提供接口用来交互

类: 一种自定义类型, 类域和访问限定符, 让外面只能看到该类的一些接口, 而看不到其具体的成员及接口的具体实现

  • 语法:class name{...}; 里面可有成员函数, 成员变量
  • 类域: 访问类域里面的代码, 需要指定类域
  • 类的实例化: 类是对对象的描述, 不占空间, 只有实例化出对象的时候才会占空间
  • 类的大小计算: 根据内存对齐规则
  • 类成员的存储方式
    • 成员变量: 存在于实例化的对象中(非静态)
    • 成员函数: 存在于公共的代码段中(同类对象的成员函数是相同的,这样更节省空间)

默认成员函数

  • 默认成员函数: 构造函数,析构函数,拷贝构造,赋值运算符,取地址及const取地址操作符
  • 默认成员函数: 我们不写编译器自动生成
  • 总结:
    • 构造函数与析构 : 内置类型: 不处理       自定义类型: 调用其构造和析构
    • 拷贝构造与赋值 : 内置类型: 浅拷贝       自定义类型: 调用其拷贝构造和赋值

示例

class A
{
public:  ...
private:int _a;int _b;
};

1.构造函数

//1.构造函数A()A(int a , int b)//初始化列表:_a(a),_b(b){}
  • 语法: 函数名与类名相同, 无返回值, 可以重载
  • 初始化列表:语法同上
    • const成员, 引用,自定义成员(没有默认构造函数), 必须在初始化列表初始化
    • 初始化列表的初始化顺序与成员变量的声明顺序相同
    • 成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
  • 功能:用来初始化对象(自动调用), 函数体内给叫赋值
  • 默认成员函数: 我们不写, 编译器自动生成
  • 默认生成的构造函数: 对内置类型不处理, 对自定义类型调用其构造函数
  • 注意:
    • 默认构造函数: 无参的构造和全缺省的构造(默认构造函数只能有1个)不然会有歧义
    • 用类实例化的时候, 无参的构造不能加(), 与函数声明存在歧义

2.析构函数

    //2.析构函数~A()
  • 语法:无参,无返回值
  • 功能:回收资源(自动调用)
  • 默认生成的析构函数, 对内置类型不处理, 对自定义类型调用其析构函数

3.拷贝构造

    //3.拷贝构造A(const A& a)//参数必须是&, 否则会死递归{_a = a._a;_b = b._b;} 
  • 语法:同上
    • 参数必须是引用:如果是传值(有临时变量产生会在调用拷贝构造), 而我们自己显示写了拷贝构造, 编译器会再次调用我们写的拷贝构造, 会出现死递归
  • 功能: 用已近存在的对象去构造一个新对象
  • 默认生成的拷贝构造: 对内置类型: 浅拷贝  对自定义类型调用其拷贝构造

4.赋值运算符

    //4.赋值运算符A& operator=(const A& a){if(this != &a)//不给自己赋值{_a = a._a;_b = b._b;}return *this;} 
  • 语法:同上
    • 不要给自己赋值(无意义)
    • 要有返回值: 可用做到连续赋值
    • 返回值是&,参数是&, 可用提高效率(没有拷贝)
    • 参数加const 避免被修改
  • 功能: 把一个对象赋值给另一个已经存在的对象
  • 默认生成的赋值: 对内置类型: 浅拷贝  对自定义类型调用其赋值
  • 注意:
    • 不要将赋值运算符写成全局的, 我们不写编译器自动生成, 全局又有一个, 会产生歧义
    • 不能重载的运算符:    .      .*      ::      :?      sizeof 

类相关的知识

this指针

  • 功能:用来区别类实例化的对象,知道是那个对象在调用成员函数
  • this指针存在于成员函数的参数列表中(第一个参数), 在栈上或寄存器
  • this指针的类型:类类型* const,即成员函数中,不能给this指针赋值
  • this指针只能在"成员函数"内部使用

static

  • static在C语言中
    • 修饰局部变量: 使其放在静态区,生命周期延长(和全局变量类似)
    • 修饰全局变量: 使其只能在声明它的文件中可见
    • 修饰函数: 使其只能在当前文件下可用
  • static在C++中
    • 修饰类成员
      • static成员变量: 属于类,共有的不属于任何对象 要在类外初始化(指定类域)
      • static成员函数: 没有this指针-->也无法访问类里的成员

const

  • const在C语言中
    • 修饰变量: 使其具有常属性, 不能被修改
  • const在C++中
    • 修饰普通变量, 已经是常量, 具有宏替换的效果
    • 修饰类成员
      • 成员变量:必须在初始化列表中初始化
      • 成员函数:本质修饰this指针, 使其指向的内容不能被改变

友元

  • 功能: 使其能够访问类的私有成员
  • 语法: 给要访问该类的函数或类加上friend

匿名对象

  • 没有名字,生命周期只有一行,通常用于仿函数,传参

explicit

  • 功能:禁止隐式类型的转换(若有默认构造函数, 一般允许隐式类型的转换发生)
  • 使用: explicit A()
  • 如 A  a1= 1;  先将1隐式类型转换为A类型的对象, 在拷贝构造a1

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

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

相关文章

Windows系统安装TortoiseSVN并结合内网穿透实现远程访问本地服务器——“cpolar内网穿透”

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

ThreeDWorld(TDW)学习(待更新)

目录 前言 1.TDW 2.transport challenge 总结 前言 因为挑战赛了解到tdw仿真平台。 想了解的请点击: GitHub - threedworld-mit/tdw: ThreeDWorld simulation environment GitHub - chuangg/tdw-transport-challenge-starter-code 1.TDW ThreeDWorld (TDW)是一…

范德蒙行列式

范德蒙行列式(Vandermonde determinant)是一种特殊形式的行列式,常在多项式理论和插值中遇到。其命名来源于法国数学家Alexandre-Thophile Vandermonde。范德蒙行列式是以一组数为变量的行列式,其特殊之处在于每一行的元素是前一行…

VSCode安装与使用详细教程

一、引言 简要介绍VSCode(Visual Studio Code)是什么,它的主要特点和用途,以及为什么选择VSCode作为代码编辑器。 二、下载与安装 访问VSCode官方网站下载页面。选择适合操作系统的版本(Windows、macOS、Linux&…

孩提家乐福愿

孩提家乐福愿 预知过往时,风雨夜晚事。 ​季暖烟火气,升级父母知。 ​爱孩绕膝闹,庭院长幼喜。 ​聚德传承系,言行耕读义。

数据卷dockerfile

目录 一、数据卷 1. 简介 2. 数据卷和数据卷容器 1. 数据卷: 2. 数据卷容器: 二、自定义镜像 1. 作用 2. 自定义centos 3. 自定义tomcat8 一、数据卷 1. 简介 数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直…

mysql修改字段的长度锁表问题

mysql修改字段的长度锁表问题 背景 MySQL(这里指5.6及其后续版本)修改字段的长度锁表会锁表吗?答案是可能会但不一定会 具体原理 MySQL 5.6 及以后版本扩大字段长度 支持 online ddl in-place 模式,而这将不会锁表。varchar 表示…

string字符串进行分割

c标准库中&#xff0c;对string字符串并没有提供分割操作&#xff0c;需要自己手动实现此功能。 方式1&#xff1a; 采用 std::stringstream 输入字符串&#xff0c;通过getline()函数&#xff0c;来对字符串进行分割。 #include <sstream>void getSplit(std::string s…

Unity—MVC分层开发思想

每日一句&#xff1a;当你不努力的时候&#xff0c;天赋就会一点一点被收回 目录 MVC分层开发思想 MVC是什么 MVC的开发步骤 案例&#xff1a;点击按钮实现金币进行添加&#xff0c;并且把金币记录到JSON里 MVC模式实现 背包系统基础代码 背包项目实现步骤 MVC分层开发思…

spring-data-redis概述及用法

一、spring-data-redis spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操作,使用java操作redis最常用的是使用jedis,但并不是只有jedis可以使用,像jdbc-redis jredis也都属于redis的java客户端,他们之间是无法兼容的,如果你在一个项目中使…

【vue+element ui】大屏自适应中el-select下拉内容在低分辨率下显示不全问题解决

目录 背景 现象 解决方案 背景 最近要把一个1920px*1080px的大屏改成自适应的&#xff1b;最低适配到1028px*720px&#xff1b; 现象 自适应适配改完之后 将电脑屏幕改成1028px*720px分辨率后&#xff0c;下拉显示正常 通过谷歌浏览器设置Toggle device toolbar为1028px*…

Fastjson2 <== 2.0.26反序列漏洞

根据Y4TACKER师傅在2023-03-20发布了一篇关于Fastjson原生反序列化的文章&#xff0c;文章中引入注目的是利用条件限制条件&#xff0c;不常常关注漏洞预警或者内容的几乎都是未发觉Fastjson2 到Fastjson2 2.0.26版本都有问题&#xff0c;其实如果单独去使用一些关键词去搜索&a…

Aws Ec2服务器设置密码登录

通过密钥&#xff0c;ssh登录到服务器 切换到root sudo -i开始设置root的新密码 passwd root输入并确认新密码即可 5.修改ssh配置文件 vim /etc/ssh/sshd_config6.重启sshd配置 systemctl restart sshd

QML中动态增加表格数据

1.QML中的表格实现 import QtQuick 2.15 import QtQuick.Window 2.15import QtQuick.Controls 2.0 import Qt.labs.qmlmodels 1.0 import QtQuick.Layouts 1.15Window {width: 640height: 480visible: truetitle: qsTr("Hello World")TableModel{id:table_modelTabl…

接口测试-幂等测试

我们知道一个网站的访问中会有很多各种各样的接口请求 比如说拿一个购物网站来说&#xff0c;有注册&#xff0c;有登录&#xff0c;有浏览商品&#xff0c;有添加购物车&#xff0c;查询购物车商品这些接口&#xff0c;还有一类特殊的接口&#xff0c;比如&#xff1a;支付。…

【JavaEE进阶】 Spring AOP详解

文章目录 &#x1f38b;前言&#x1f38d;Spring AOP核心概念&#x1f6a9;切点(Pointcut)&#x1f6a9;连接点(Join Point)&#x1f6a9;通知(Advice)&#x1f6a9;切面(Aspect) &#x1f340;通知类型&#x1f6a9;注意事项 &#x1f332;PointCut&#x1f384;切面优先级Ord…

elasticsearch中设置查询的请求超时时间

参考&#xff1a;https://www.phpmianshi.com/?id251 背景 因为我们的项目是用的php&#xff0c;为了防止调用搜索时&#xff0c;请求处理时间太长&#xff0c;导致php-fpm占满&#xff0c;所以需要对外部接口设置请求的超时时间&#xff0c;避免过多的超时请求&#xff0c;我…

深入理解Linux线程(LWP):概念、结构与实现机制(1)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;会いたい—Naomile 1:12━━━━━━️&#x1f49f;──────── 4:59 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

vue 解决:点击左侧相同菜单,右侧页面不重新加载的问题

1、问题描述&#xff1a; 其一、需求为&#xff1a; 无论是通过路由组件形成的平台管理系统&#xff0c;还是通过文件配置形成的平台管理系统&#xff0c;都存在通过切换左侧的导航栏而使右侧的页面切换的业务需求&#xff1b; 其二、问题描述为&#xff1a; A、步骤一&#…

Redis很慢,如何排查及解决?

性能分析工具&#xff1a; 使用Redis自带的命令或者第三方工具进行性能分析&#xff0c;比如INFO命令、MONITOR命令、SLOWLOG命令等。使用外部性能分析工具&#xff0c;如Redis的慢查询日志、Redis的监控工具、操作系统的性能分析工具&#xff08;例如top、htop、sar等&#xf…