【C++】入门【三】

server/2024/11/29 23:29:31/

本节目标


一、类的6个默认成员函数

二、 构造函数

三、析构函数

四、拷贝构造函数

五、赋值运算符重载

六、const成员函数

七、取地址及const取地址操作符重载


一、类的6个默认成员函数

  • 如果类里一个成员都没有,简称空类
  • 空类中真的什么都没有吗?并不不是,任何类在什么都不写的情况下,编译器会自动生成6个默认成员函数
  • 默认成员函数:用户没有显式实现,编译器自动生成的成员函数

二、构造函数

1.构造函数的概念

  • 每个类成员变量都需要初始化
  • 这是C语言时期的初始化,自己在类里写初始化函数
  • 但是如果每个类对象在实例化完,都需要去调用初始化函数去进行初始化,就比较繁琐了
  • 此时,能否在类对象创建时,就将数据初始化呢?
  • 然后产生了构造函数
  • 构造函数是一个特殊的成员函数,名字与类名相同,创建类对象时由编译器自动调用它
  • 来保证每个数据成员都有一个自己的初始值,并且在类对象的整个声明周期只调用一次

2.构造函数的特性

  • 构造函数是特殊的成员函数,虽然名字叫构造,但是其主要任务不是构造类,而是初始化对象
  • 其特征如下
  • 1.函数名与类名相同
  • 2.无返回值
  • 3.对象实例化时自动调用对于构造函数
  • 4.构造函数可以重载(重载是后期知识)
  • 构造函数分为无参和有参
  • 为啥调用无参时不带括号呢,因为带了括号就变成函数声明了.......so you know
  • 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦 用户显式定义编译器将不再生成
  • 关于编译器生成的默认成员函数,看起来好像没什么用,也没有对变量进行初始化,变量依旧是随机值
  • 那这里的默认构造函数有啥用呢?
  • 其实 C++把类型分为内置类型也就是(基本类型)和自定义类型,内置类型就是语言本身提供的数据类型,例如int char 等等,自定义类型就是我们使用class/struct/union等自己定义的类型
  • 假设在一个类里面不仅定义了内置类型变量,还定义了一个自定义类型变量,如图
  • 此Time 也是一个class类,用他来定义了一个类对象_t
  • Time类如下图
  • 此时我们在实例化Date类对象的时候,因为我们没写构造函数,所以编译器自动生成且调用了默认构造函数,此时虽然里面的_year _m....变量还是随机值,但是他还会去调用Time类的构造函数去对Time类实例化出的_t对象里的变量进行初始化
  • 所以可以简单理解为,虽然默认构造函数不会对内置类型变量赋值,但是会对自定义类型也进行调用其构造函数,来初始化自定义类型对象
  • 注意:C++11中针对内置类型不初始化的缺陷,又打了补丁:内置类型成员变量可以在类中声明时给默认值
  • 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只有一个
  • 我们没写 编译器默认生成的都可以认为是默认构造函数
  • 简单的说 实例化类对象不需要传参的就是默认构造函数 需要传参的就叫普通构造函数

三、析构函数

1.析构函数的概念

  • 析构函数跟构造函数完全相反,析构函数是销毁对象中的资源
  • 但是不是完成对象本身的销毁,局部对象的销毁是编译器来完成的
  • 在对象销毁时,会自动调用析构函数,完成对象中的资源清理工作

2.析构函数的特性

  • 析构函数是特殊的成员函数,其特征如下
  • 1.析构函数名 是在 类名前面加上~
  • 2.析构函数无形参无返回值
  • 3.一个类只能有一个析构函数,未显式定义,则编译器自动生成默认的
  • 4.析构函数不能重载 只能有一个
  • 5.对象生命周期结束后,C++编译器会自动调用析构函数
  • 注意:如果类中没有申请资源时,可以不写析构,使用默认的即可,但如果有资源申请 例如mallolc或new 则一定要写,否则会导致内存资源泄露

四、拷贝构造函数

1.拷贝构造函数的概念

  • 创建一个跟已存对象相同的新对象
  • 只有一个形参,该形参是对类类型对象的引用(一般都加上const修饰)
  • 编译器自动调用并创建好对象

2.拷贝构造函数的特征

  • 是构造函数的重载形式
  • 拷贝构造形参只有一个,必须是类类型对象的引用,使用传值编译器直接报错,因为会无穷递归拷贝构造下去
  • 若未显式定义,编译器自动生成默认的
  • 默认的拷贝构造函数对象按照内存拷贝方式完成拷贝,这种拷贝叫浅拷贝,也叫值拷贝,不太安全
  • 虽然编译器自己生成的浅拷贝也能实现拷贝,但是如果是涉及到内存空间方面呢?
  • 例如 拷贝出来的类对象 里面的指针变量 指向同一块区域,没有自己单独的区域
  • 此时析构两个对象时,同一块空间被两次释放delete,编译器就会报错
  • 所以我们还是要自己写拷贝,写深拷贝

五、赋值运算符重载

1.运算符重载

  • C++为了代码的可读性 新增了 运算符重载,运算符重载是具有特殊函数名的函数
  • 也具有返回值类型,函数名字以及参数列表

2.赋值运算符重载

  • 参数类型:const T& 引用可以提高效率
  • 返回值类型:T& 传引用返回可以提高效率,有返回值目的是为了连续赋值
  • 检查自己是否要给自己赋值
  • 返回*this
  • 赋值运算符只能重载成类的成员函数,不能重载成全局函数
  • 没显式写则系统默认生成,也是浅拷贝,面对涉及到内存资源时,我们还是要自己写

3.前置++和后置++重载


六、const成员函数

  • 被const修饰的成员函数叫const成员函数
  • 由于this指针是隐藏的,所以我们不用写实参,但是实参如果想加const呢
  • 此时可以这样

七、取地址及const取地址操作符重载

  • 用的很少,了解就行


http://www.ppmy.cn/server/146020.html

相关文章

Linux自动化构建-make/Makefile

目录 1. 背景2. 基本使用3. 推导过程4. 好用的操作5. 拓展语法 1. 背景 会不会写makefile,从⼀个侧⾯说明了⼀个⼈是否具备完成⼤型⼯程的能⼒⼀个⼯程中的源⽂件不计数,其按类型、功能、模块分别放在若⼲个⽬录中,makefile定义了⼀系列的规…

Linux环境下配置neo4j图数据库

1.下载安装包 openjdk-11.0.1_linux-x64_bin.tar.gz neo4j-community-4.2.19-unix.tar.gz 2.之前配置好的配置文件 neo4j.conf 3.安装 3.1-jdk11的安装(jdk1.8不够用) 解压缩 tar -zxvf openjdk-11.0.1_linux-x64_bin.tar.gz修改系统环境变量 打开pro…

Spring cache注解:缓存与业务解耦实战

Spring缓存机制通过EnableCaching开启,配合Cacheable、CachePut、CacheEvict等注解,为Java应用提供了一种声明式管理缓存的方式。这些注解使得缓存配置变得简洁明了,允许开发者轻松实现数据的自动缓存、更新和清除,从而优化应用性…

泷羽sec-linux进阶

基础之linux进阶 声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽…

Git 使用问题与解决方案

Git 使用问题与解决方案 目录 常见错误及原因分析检查当前使用 HTTPS 或 SSH如何切换远程仓库到 SSHSSH 密钥的配置与验证错误解决步骤总结与参考 1. 常见错误及原因分析 错误提示 fatal: unable to access https://github.com/username/repository.git/: Failed to connect…

Sqlalchemy学习

连接数据库 import sqlalchemydatabase_url mysqlpymysql://username:passwordlocalhost:3306/database # pymysql 需要下载包 pip install pymysql engine sqlalchemy.create_engine(database_url) # 创建了一个数据库引擎# 测试连接 try:with engine.connect() as connec…

【君正T31开发记录】8.了解rtsp协议及设计模式

前边搞定了驱动,先不着急直接上手撸应用层的代码,先了解一下大致要用到的东西。 设计PC端先用vlc rtsp暂时H264编码(vlc好像不支持h265,这个后边我试试)的视频流,先需要支持上rtsp server,了解rtsp协议是必…

C#-winform:项目打包

一、安装扩展包 1、打开扩展界面,增加可以打包为exe文件的工具 扩展->管理扩展 2、搜索并下载扩展 Microsoft Visual Studio Install Projects 注:安装的时候会推出visual studio的,重启一下就会生效,搜到Setup Project 二、…