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

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

相关文章:

  • Pyglet综合应用|推箱子游戏之关卡图片载入内存
  • JMETER与它的组件们
  • 【C++】树形关联式容器set、multiset、map和multimap的介绍与使用
  • DAY12_VUE基本用法详细版
  • 深度学习--神经网络基础
  • 数仓项目6.0(二)数仓
  • 【Linux C | 网络编程】gethostbyname 函数详解及C语言例子
  • 人工智能与网络安全
  • Android 监听网络状态变化
  • POST参数里加号+变成空格的问题处理
  • C++内存管理【new 和 delete 关键字】笔记
  • 【Leetcode】938. 二叉搜索树的范围和
  • 【QT+QGIS跨平台编译】之五十五:【QGIS_CORE跨平台编译】—【qgsmeshcalcparser.cpp生成】
  • 【C#】SixLabors.ImageSharp和System.Drawing两者知多少
  • 刷题 16 前缀和
  • [PHP内核探索]PHP中的哈希表
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • extract-text-webpack-plugin用法
  • Hexo+码云+git快速搭建免费的静态Blog
  • java2019面试题北京
  • java第三方包学习之lombok
  • MaxCompute访问TableStore(OTS) 数据
  • python 装饰器(一)
  • Web设计流程优化:网页效果图设计新思路
  • 从零开始学习部署
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 汉诺塔算法
  • 好的网址,关于.net 4.0 ,vs 2010
  • 试着探索高并发下的系统架构面貌
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • No resource identifier found for attribute,RxJava之zip操作符
  • Java性能优化之JVM GC(垃圾回收机制)
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (2)Java 简介
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (pojstep1.3.1)1017(构造法模拟)
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (ZT) 理解系统底层的概念是多么重要(by趋势科技邹飞)
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (七)Java对象在Hibernate持久化层的状态
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .Net的DataSet直接与SQL2005交互
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .Net中的设计模式——Factory Method模式
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • ;号自动换行
  • @EnableWebMvc介绍和使用详细demo