标准C++day3——构造、析构函数和初始化列表

一、面向对象和面向过程

    面向过程:

        关注如何解决问题,以及解决问题的步骤

   

    面向对象:

        关注的解决问题的"人"-"对象",以及实现能解决问题的"对象"

       

        抽象:先找出(想象)能解决问题的"对象",分析该对象解决问题所需要的属性(成员变量)和行为(成员函数)

       

        封装:把抽象的结果封装成一个类类型(结构),并给类的成员变量、成员函数设置相对应的访问控制权限(public\private\protected)

        继承:

            1、在封装类前先考虑现有的类是否能解决部分问题,如果有则可以通过继承,只需要在此基础上扩展即可,从而缩短解决问题的时间

            2、把一个复杂的大问题拆分成若干个不同的小问题,给每个小问题设计一个类去解决,最后把这些类通过继承合并成一个能解决大问题的类,从而降低问题的难度

        多态:

            发出一个指令,系统会根据实际情况执行不同的操作,这种特征称为多态(一个指令多种形态)

            比如重载过的函数、当调用函数时会根据参数的不同调用不同的版本,具体调用哪个版本在编译期间可以确定,称为编译时多态

    注意:面向对象的细节的本质上还是面向过程,因此面向对象不是解决问题的捷径,而是以更高的维度去思考问题

二、类和对象

    什么是类和对象

        类是由程序员设计一种数据类型,里面包含有成员变量、成员函数

        而对象就是类的实例化,可以理解为使用类类型创建的变量,创建的过程叫做实例化

   

    类的设计和对象的实例化: 

        class 类名

        {

            成员变量;   //  类中默认属性是private私有

        public:

            成员函数;

        };

        对象的实例化:

        方法1: 类名 类对象名;

        方法2: 类名* 类对象名_p = new 类名;

    类的声明、实现、使用:

        1、在头文件中声明:

            class 类名

            {

                成员变量;

            public:

                返回值 成员函数名(参数列表);

            };

        2、在源文件中实现成员函数

            返回值 类名::成员函数名(参数列表)

            {

                //  在成员函数中可以直接使用成员变量、成员函数

                //  不需要使用 . -> 来表示访问

            }

        注意:如果类的内容不多,也可以直接在头文件中把成员函数实现

   

三、访问控制限定符

    private

        私有的,被它修饰的成员只能在类内访问,这是类的默认访问属性

        设置为私有的是为了对类进行保护,一般会把成员变量设置私有

    public

        公开的,被它修饰的成员可以在任意位置访问

        一般会把成员函数设置公开

    protected

        保护的,被修饰的成员只能在本类内和它的子类中访问,但不能在类外访问

四、构造函数

    构造函数就是与类名同名的成员函数,当实例化对象时它会自动执行,当构造函数执行结束后,对象才完成实例化

    任务:一般负责对类对象进行初始化、资源分配

    class 类名

    {

        int* p;

    public:

        类名(参数)

        {

            p = new int;

        }

    };

    1、构造函数必须是public,否则无法实例化对象    

    2、构造函数可以重载,可以有多个版本的构造函数(无参、有参)

    3、带参数的构造函数的调用

        类名 对象名(实参);   //  使用实参调用有参构造

        类名* 对象名 = new 类名(实参);  //  使用实参调用有参构造

    4、默认情况下编译器会自动生成一个什么都不干的无参构造函数,但一旦显式地实现了构造函数,就不再自动生成该无参构造函数了

    5、如果给有参构造设置了默认形参,实例化对象时可以出现类似调用无参构造的语句,但实际是调用有参构造

    6、构造函数没有返回值

    7、不能使用malloc给类对象分配内存,因为它不会调用构造函数

五、析构函数

    任务:析构函数一般负责对类对象内容进行收尾工作,例如:释放资源、保存数据等

    当对象销毁时会自动执行

    class 类名

    {

        int* p;

    public:

        类名(参数)

        {

            p = new int;

        }

        ~类名(void)

        {

            delete p;

        }

    };

    1、析构函数也必须是public

    2、析构函数没有参数、没有返回值、不能重载

    3、当类对象生命周期完结,被操作系统自动释放(栈),或者通过delete手动释放(堆) 才会调用析构函数

    4、构造函数必定执行,但析构函数不一定会执行

    5、不能使用free销毁类对象,因为不会调用析构函数

    6、如果没有显式地实现析构函数,编译器也会自动生成一个什么都不做的析构函数

六、初始化列表

    初始化列表是属于构造函数的一种特殊语法,只能在构造函数中使用

    class 类名

    {

        const 成员1;

        成员2;

    public:

        类名(参数) : 成员1(val),成员2(val) // 初始化语句 val可以是常量、变量

        {

            //成员1 = val; 属于赋值语句 不是初始化 带const属性的成员就无法赋值

        }

    };

    注意:    

    1、初始化列表是先于构造函数执行,初始化列表执行时类对象还没有实例化完成,因此它是一种给const属性成员变量初始化的最佳方案

    2、当参数名与成员名相同时,初始化列表可以分辨出来,可以同名

    3、当成员中有类类型,该成员的有参构造函数可以在初始化列表中调用

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

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

相关文章

正中优配:股票出现xd是好还是坏?

近年来,股票市场的日渐成熟和开展使得出资者们关于股票价格的涨跌也愈加灵敏,特别是股票呈现XD之后,更是引起了一系列热议。那么,股票呈现XD是好还是坏?本文将从多个角度进行剖析。 首要,需要清晰XD的定义…

2023年9月制造业NPDP产品经理国际认证报名来这错不了

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

设计模式-命令模式

文章目录 前言命令模式简介命令模式的示例代码命令模式使用场景命令模式优缺点 前言 命令模式(Command Pattern)是一种行为型设计模式,用于将请求发送者和请求接收者解耦,使得可以在不同的上下文中灵活地传递请求,记录…

Gin中的Cookie和Session的用法

Gin中的Cookie和Session的用法 文章目录 Gin中的Cookie和Session的用法介绍Cookie代码演示 Session代码展示 介绍 cookie 和 session 是 Web 开发中常用的两种技术,主要用于跟踪用户的状态信息。 Cookie func (c *Context) Cookie(name string, value string, max…

java Math类中的random方法和Random类中方法的区别

文章目录 Math类中的random()方法Random类 Math类中的random()方法 Math类中的random()方法没有参数,它会默认返回等于0.0、小于1.0的double类型随机数。对double()方法返回的数字稍加处理,即可实现任意范围随机数的功能 public class MathTest {publi…

vue 前端 问题整理

列表显示字典数据 template里面的vue代码 <el-table-column label"性别" align"center" prop"sex"><template #default"scope"> <!-- <dict-tag :optionssysUserSex :value"scope.row.sex&quo…

Redis持久化、主从与哨兵架构详解

Redis持久化 RDB快照&#xff08;snapshot&#xff09; 在默认情况下&#xff0c; Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中。 你可以对 Redis 进行设置&#xff0c; 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时&#xff0c; 自动保存一次数…

【Linux】让笔记本发挥余热,Ubuntu20.04设置WiFi热点

Ubuntu20.04设置WiFi热点 由于卧室距离客厅较远&#xff0c;wifi信号太弱&#xff0c;体验极差。鉴于卧室的笔记本电脑是通过网线连接的客厅路由器&#xff0c;因此考虑将这台老破笔记本作为“路由器”&#xff0c;以便发挥它的余热。实验证明&#xff0c;上网速度提升数十倍&a…

Kubectl 使用详解——k8s陈述式资源管理

目录 一、kubectl 简介 二、kubectl 的使用 1.基础用法 &#xff08;1&#xff09;配置kubectl自动补全 &#xff08;2&#xff09;查看版本信息 &#xff08;3&#xff09;查看资源对象信息 &#xff08;4&#xff09;查看集群信息 &#xff08;5&#xff09;查看日志…

taro vue3 ts nut-ui 项目

# 使用 npm 安装 CLI $ npm install -g tarojs/cli 查看 Taro 全部版本信息​ 可以使用 npm info 查看 Taro 版本信息&#xff0c;在这里你可以看到当前最新版本 npm info tarojs/cli 项目初始化​ 使用命令创建模板项目&#xff1a; taro init 项目名 taro init myApp …

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

今天聊TC3xx HSM系统,包括所用内核、UCB相关信息、Host和HSM交互方式。 1、HSM系统架构 下图来源于英飞凌官网培训材料。 TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及T…

算法通关村第十七关:白银挑战-贪心高频问题

白银挑战-贪心高频问题 1. 区间问题 所有的区间问题&#xff0c;参考下面这张图 1.1 判断区间是否重叠 LeetCode252 https://leetcode.cn/problems/meeting-rooms/ 思路分析 因为一个人在同一时刻只能参加一个会议&#xff0c;因此题目的本质是判断是否存在重叠区间 将区…

30天入门Python(基础篇)——第2天:Python安装(保姆级)与IDE的认识与选择+详细安装教程

文章目录 专栏导读上一节课回顾1、Python解释器的安装查看各个版本的Python解释器①、ok,双击安装②、这里我们选择【自定义】安装&#xff0c; 下面的【将Python添加在环境变量】大家一定要打个勾③、点击【Next】进行下一步④、这里不建议安装在C盘, 点击【Browse】我在F盘创…

Java——》公平锁、非公平锁

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

C++ 多态

引例&#xff1a; #include<iostream> using namespace std; class Animal { public:void speak(){cout<<"动物在说话"<<endl;} }; class Cat:public Animal { public:void speak(){cout<<"小猫在说话"<<endl;} }; void Do…

Element U I的 el-date-picker做时间限制

Element U I的 el-date-picker做时间限制 Element U I的 el-date-picker做时间限制 Element U I的 el-date-picker做时间限制 ###公司需要限制起始时间为今年的第一天。 特定的时间 干脆写死得了&#xff01; 最有用的就是下面这句&#xff1a; disabledDate(time) { // 这个是…

多线程和并发编程(2)—CAS和Atomic实现的非阻塞同步

在并发编程中实现原子操作可以使用锁&#xff0c;锁机制满足基本的需求是没有问题的了&#xff0c;但是有的时候我们的需求并非这么简单&#xff0c;我们需要更有效&#xff0c;更加灵活的机制&#xff0c;synchronized关键字是基于阻塞的锁机制&#xff0c;也就是说当一个线程…

CSS整理

目录 CSS中的& 弹性&#xff08;display:flex&#xff09;布局 flex的对齐方式 justify-content align-items flex-wrap 弹性盒换行 flex:1 flex属性 flex-grow&#xff1a;项目的放大比例 flex-shrink&#xff1a;收缩 flex-basis&#xff1a;初始值&#xff…

从零开始学习 Java:简单易懂的入门指南之HashMap及TreeMap源码解读(二十四)

HashMap及TreeMap源码解读 HashMap源码TreeMap源码 HashMap源码 1.看源码之前需要了解的一些内容Node<K,V>[] table 哈希表结构中数组的名字DEFAULT_INITIAL_CAPACITY&#xff1a; 数组默认长度16DEFAULT_LOAD_FACTOR&#xff1a; 默认加载因子0.75HashMap里…

GE IS220PAICH2A 336A4940CSP11 数字量输入模块产品应用领域

GE IS220PAICH2A 336A4940CSP11 是一款数字量输入模块&#xff0c;通常用于工业自动化和控制系统中&#xff0c;用于监测和采集数字输入信号。这种类型的模块可以在各种应用领域中发挥作用&#xff0c;以下是一些可能的应用领域&#xff1a; 工业过程控制&#xff1a; GE IS220…