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

C++ 类一

文章目录

    • 1.类
      • 1.访问控制说明符
      • 2.成员函数
        • 1. 构造函数
          • 1.无参构造函数
          • 2.拷贝构造函数
          • 3.移动构造函数(C++11)
      • 3.编译器生成的构造函数类型
        • 1. 默认构造函数
        • 2. 拷贝构造函数(浅拷贝)
        • 3. 拷贝赋值运算符(浅拷贝)
        • 4. 移动构造函数
        • 5. 移动赋值运算符
        • 6. 其他
      • 4.析构函数

1.类

类(Class) 是 C++ 中实现面向对象编程(OOP)的核心机制,它将数据(成员变量)和操作数据的函数(成员函数)封装在一起,形成一个独立的实体。

1.访问控制说明符

  • private:仅类内部和友元可访问
  • public:类内外均可访问
  • protected:类内部、友元和派生类可访问

为什么需要三种?
1.安全性:private防止数据被非法访问,public定义安全接口。
2.可扩展性:protected允许派生类访问基类的关键信息,支持继承与多态。
3.封装性:通过分层控制,隐藏实现细节,降低模块间耦合度。

2.成员函数

类内声明,类外定义(使用作用域解析符::)。

1. 构造函数

一种特殊的成员函数,用于初始化对象的状态。
可重载。

1.无参构造函数

若未定义任何构造函数,编译器会生成一个默认构造函数(仅当类没有自定义构造函数时)。

语法:空的实现体。

行为
按顺序:
1.构造虚基类(如果有)
2.调用基类的默认构造函数(如果有基类)。
3.调用成员的默认构造函数(如果成员有默认构造函数)。
4.初始化虚函数表指针(如果类有虚函数或虚基类)。

不初始化内置类型成员(如int、指针等),其值为未定义。

编译器生成的其他构造函数与此类似。

便利
1.使用= default强制编译器生成默认实现:
2.禁用构造函数:使用= delete。

构造函数的初始化列表
1.高效初始化:直接初始化成员变量,优于在函数体中赋值。

初始化优先于函数体的本质原因
1.内存安全:确保对象在使用前完全初始化。

2.拷贝构造函数

用已有对象初始化新对象:参数为const引用。

3.移动构造函数(C++11)

转移资源所有权:避免深拷贝,提高性能。

语法
参数 && ,不加const,因为加了后转移后无法设置nullptr

3.编译器生成的构造函数类型

1. 默认构造函数

1.生成条件:类未定义任何构造函数。

2.被隐式删除:类有引用成员或const成员或没有默认构造函数的类类型成员。

其他:如果类的析构函数、拷贝构造函数或拷贝赋值运算符被显式删除(= delete),默认构造函数可能被隐式删除(取决于具体编译器实现)。

2. 拷贝构造函数(浅拷贝)

1.生成条件:类未显式定义拷贝构造函数。

2.被隐式删除:类有引用成员或 **const成员 ** + 扩充

3. 拷贝赋值运算符(浅拷贝)

1.生成条件:类未显式定义拷贝赋值运算符。

2.被隐式删除:类有引用成员或 **const成员 ** + 扩充

4. 移动构造函数

1.生成条件:

  • 1.类未显式定义拷贝构造函数、拷贝赋值运算符、移动赋值运算符和析构函数。
  • 2.所有基类和成员均可移动(即有可用的移动构造函数)。

2.被隐式删除:类有引用成员或 **const成员 **+ 扩充

5. 移动赋值运算符

1.生成条件和移动构造函数类似:

  • 1.类未显式定义拷贝构造函数、拷贝赋值运算符、移动构造函数和析构函数。
  • 2.所有基类和成员均可移动(即有可用的移动赋值运算符)。

2.被隐式删除:类有引用成员或 **const成员 **+ 扩充

6. 其他

遵循三 / 五法则:若定义了析构函数、拷贝构造函数或拷贝赋值运算符,应定义全部五个(析构、拷贝构造、拷贝赋值、移动构造、移动赋值)。

Explicit 作用
用于禁止构造函数或转换运算符的隐式类型转换。 需要传入一个参数的构造函数初始化。
explicit构造函数会阻止聚合初始化(花括号初始化):

4.析构函数

对象销毁时,析构函数按以下顺序调用:

  1. 执行类的析构函数体(如果有自定义代码)。
  2. 成员变量的析构函数(按声明的逆序)。
  3. 基类析构函数(继承列表中声明的逆序)。
    4.处理虚基类(如果有)。
    虚基类的析构函数在所有非虚基类之后调用,顺序与构造时相反。

相关文章:

  • iTunes 无法备份 iPhone:10 种解决方法
  • Spring Framework 中 UriComponentsBuilder工具类
  • 设计模式-外观模式
  • 数学复习笔记 26
  • 【趣味Html】第11课:动态闪烁发光粒子五角星博客
  • 数据分析之OLTP vs OLAP
  • 【华为云学习与认证】以华为云物联网为基座的全栈开发(从物联网iot平台模块到应用展示、数据分析、机器学习、嵌入式开发等)的系统性学习与认证路线
  • Async-profiler 内存采样机制解析:从原理到实现
  • springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
  • 微服务面试资料1
  • Cursor 工具项目构建指南: Python 3.8 环境下的 Prompt Rules 约束
  • AWS 成本异常检测IAM策略
  • 力提示(force prompting)的新方法
  • 数据库管理-第333期 Oracle 23ai:RAC打补丁完全不用停机(20250604)
  • 深入理解系统:UML类图
  • Java面试专项一-准备篇
  • STM32实战:智能环境监测站设计方案
  • URL 结构说明+路由(接口)的认识
  • Cisco IOS XE WLC 任意文件上传漏洞复现(CVE-2025-20188)
  • 【25软考网工】第十章 网络规划与设计(1)综合布线
  • 网站建设维护管理办法/软文平台有哪些
  • 做网站好的公司/如何查看百度搜索指数
  • wordpress forum/seo站长综合查询
  • 建设网站需要注意什么问题/长春百度推广公司
  • 免费软件无线看破解版/烟台seo
  • 网站面包屑导航设计特点/太原做网站的工作室