当前位置: 首页 > 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.处理虚基类(如果有)。
    虚基类的析构函数在所有非虚基类之后调用,顺序与构造时相反。
http://www.xdnf.cn/news/872443.html

相关文章:

  • 笔记 | docker构建失败
  • 乡村三维建模 | 江苏农田无人机建模案例
  • 深入解析FutureTask:原理与实战
  • 【RAG召回优化】rag召回阶段方法探讨
  • 学习STC51单片机27(芯片为STC89C52RCRC)
  • 34.1STM32下的can总线实现知识(区分linux)_csdn
  • 洛谷B2147 求 f(x,n)
  • 解决SQL Server SQL语句性能问题(9)——SQL语句改写(1)
  • 2ETLCloud:重新定义AI驱动的数据集成未来
  • 四、OpenCV图像处理- 视频操作
  • ArcGIS计算多个栅格数据的平均栅格
  • Educational Codeforces Round 179 (Rated for Div. 2)(A-E)
  • 看不见的守护者
  • 【机器人编程基础】循环语句for-while
  • 内存管理【Linux操作系统】
  • IEEE ICBCTIS 2025 会议征稿:探索区块链与信息安全的前沿学术之旅​
  • 操作系统学习(十三)——Linux
  • Elasticsearch 海量数据写入与高效文本检索实践指南
  • 上门服务小程序订单系统框架设计
  • Docker 常用命令详解
  • 洛谷每日1题-------Day40__P1720 月落乌啼算钱(斐波那契数列)
  • 卡西欧模拟器:Windows端功能强大的计算器
  • matlab实现高斯烟羽模型算法
  • AA-CLIP: Enhancing Zero-Shot Anomaly Detection via Anomaly-Aware CLIP
  • Linux操作系统Shell脚本概述与命令实战
  • 英伟达288GB HBM4+50P算力
  • 云数据库选型指南:关系型 vs NoSQL vs NewSQL的企业决策
  • Selenium自动化测试工具安装和使用(PyCharm)
  • Java运行环境配置日志(Log)运行条件,包含鸿蒙HarmonyOS
  • 函数与运算符重载