02.01_111期_C++_构造函数初始化列表笔记

    运算符重载对
     1. 操作数的个数   2. 操作数出现的顺序都有确定要求
    所以如果 对 << 这个操作符进行重载,
     <<这个操作符有两个操作数,而且左右操作数有顺序要求
     那么d1将成为this指针指向的对象,也将会 << 的左操作数

     注意:下面的程序 是由于权限被放大而导致编译错误
     首先调用构造函数,创建的d1实例的数据类型是 const Date
     而d1.Print();这句话实际上执行的是 d1.Print(&d1);
     此时但是实参传过去,将指针变量传给this指针这个形参的时候
     由于this指针的数据类型是 Date*类型,所以权限被放大,将会导致编译错误
     要想把this 指针改成const Date*类型的,
     可以直接在类中定义这个成员函数时,写成void Print() const
     void Print() const  中的const只针对this指针而提出
 
     上述的权限问题只有针对指针型变量和引用型变量才讨论
     因为只有这两种变量会存在访问权限的问题
    const Date d1(2024, 1, 31);
    d1.Print();

    成员函数如果是一个对成员变量只进行读访问的函数,
     建议在成员函数后面加const,这样const对象和非const对象都可以使用

C++中的六个默认成员函数:
 1. 构造函数:作用是初始化对象
 2. 析构函数:对象在销毁时会自动调用析构函数,完成对象中资源的清理工作
 3. 拷贝构造:只有单个形参,该形参是对本类类型对象的引用(一般用const修饰)
                在用已存在的类类型对象创建新对象时由编译器自动调用
 4. 赋值(运算符)重载:把一个已有对象赋值给另一个对象
 5. 取地址操作符重载:取出类的地址
 6. const修饰的取地址操作符重载:取出类的地址,而且取出的地址是只读的
 
 5,6这两个默认成员函数一般都不需要自定义,
       直接采用编译器自动生成的默认成员函数即可
       下面展示在编译器中这两个函数是怎么实现的
       都是对 & 这个操作符进行重载,
           5对应的是第一个操作符重载函数,直接对类取地址
           6对应的是第二个操作符重载函数,其中this指针的权限被规定为const类型

    初始化列表有两种代码写法
     初始化列表是每个成员变量定义初始化的位置
    写法一:初始化列表
          这种初始化方式遵循几个原则
          1. 根据成员变量的声明顺序来决定成员变量的初始化顺序
          2. 可以在成员变量声明的时候给定缺省值,
             但是一旦在列表中出现了这个成员变量的定义,将无视缺省值
          3. 若成员变量满足下列条件,只能通过初始化列表进行初始化
             3.1 成员变量被const修饰
             3.2 成员变量是引用型变量
             3.3 成员变量是自定义类型的成员
                 自定义类型的中的自定义成员必须初始化,初始化有两种方式
                 3.3.1 调用构造函数(编译器生成的 or 自己写的全缺省或无参的函数)
                 3.3.2 在初始化列表中直接给定初始值
          4. 一个变量只能在初始化列表中出现一次
 

     以下的构造函数被称为单参数构造函数
     可以直接通过整型给这个函数初始化
     在构造函数前加上explicit,就能让上述初始化时不能进行隐式转换

     单参数构造函数支持隐式类型的转换
     这是因为可以直接依靠 2 构造一个临时对象,
     再通过拷贝构造创建cc2

    如果在类中用static修饰了一个变量,
    那么这个在创建该类的实例时需要注意:
     1. 在类的内部不能既不能通过缺省值初始化这个变量
          也不能在构造函数中的初始化列表中初始化
              这是因为这个变量是属于所有创建出来的该类的实例
              而不是属于某个实例
     2. 在创建了两个该类的实例时,第二个实例中的n是在第一个实例中的n上修改的
     3. 在创建了实例以后,由于访问限定符的限制,
        无法直接通过实例访问n
     4. 定义时是用  数据类型 变量所属类::被static修饰的变量 三段式进行初始化
          但在外面无法通过 变量所属类::被static修饰的变量进行修改
          只能通过调用类中的与该变量有关的成员函数进行修改
        注意:一、3,4都是由于有private访问限定符进行限制
                  如果将这个变量不进行private限制,那么可以通过
                    1. A::n
                    2. 实例.n
                    3. A* p; p->n进行访问
              二、如果这个变量进行private限制后还要进行访问,
                    那么可以通过重新写一个成员函数,放到public中,
                    这个成员函数的功能就只是为了拿到n
              三、4中所说的  数据类型 变量所属类::被static修饰的变量
                    1. 这种形式的具体例子是 int A::n = 0; 
                       而且n 必须是静态变量才能这么访问
                    2. 如果要在调用的时候使用这种形式调用成员函数
                       该成员函数也必须是静态函数才行
                       也就是先在A中写一个 static 成员函数(形参)
                       再用A::成员函数(实参)调用
                       静态的成员函数没有this指针

在将运算符   <<   进行重载时,如果要把变量限定为private
 又不能把重载函数直接写到类中(this指针的存在)
 这就导致需要使用友元将这些变量专门提供给 再类外面的重载函数使用

     B这个类受A类的类域的限制,这样定义的类指明了B是一个内部类
     但是并不在A中占据存储空间
     内部类就是外部类的友元类,也就是内部类可以直接访问外部类中的private限定的内容

    先构造 + 拷贝构造 -> 
    优化成拷贝构造
    A aa1 = 2;

    下面这句话是通过 2 这个变量给A类的但操作数构造函数进行构造
     构造生成一个临时变量,在给这个临时变量起个别名,叫做aa2
    const A& aa2 = 2;

    下面这个函数由于 f1 的形参直接是 A 这个类型
    所以会发生拷贝构造
    如果不想进行拷贝构造,可以采用两种方式
          1. 将f1的形参改成引用形式,如f2()
          2. 将将匿名对象作为实参传过去,如f1(A(2));
             此时不会拷贝构造是因为  
             有些编译器会对匿名对象传参和拷贝对象这两步合二为一(即优化)

C/C++程序中程序内存区域划分为:
内核空间,栈,内存映射段,堆,数据段(也可以叫静态区),代码段(也可以叫常量区)
为什么要分这些区域?
    为了方便管理
那个区域能够让程序员自己控制?
  堆区,也就是动态开辟空间的区域(malloc,new)
 

 全局变量、全局的静态变量、局部的静态变量都存在 数据段(静态区)中
 局部变量,在函数内申请的静态数组中的数据(比如下面的num1数组)都存在栈区中
 字符串变量,字符串本身是放到代码段(常量区中的),
 但是下面定义的  接收字符串的字符串数组char2  是拷贝了在常量区中的字符串以后
 复制到栈区中的,所以这个字符串数组char2是放到栈区的
 如果堆char2进行解引用,得到字符a,仍放到栈区中
 字符型指针pChar3虽然被const修饰,但是pChar3这个指针变量仍放在栈区中
 如果堆pChar3进行解引用,将会得到字符串本身,所以*pChar3是放到常量区中的
       注意:因为字符串本身和拷贝过来的字符数组放到不同的内存空间中,
             所以可以对char2进行解引用修改字符数组中的值
             但是不能对pChar3进行解引用修改常量字符串的值
 
 ptr1是一个在函数test中的指针变量,该变量存储的地址的值是动态空间的开始的地址
 但是ptr1作为一个指针变量仍放到栈区中,
 对ptr1解引用得到的是申请的动态空间开始的地址,这个地址是是堆区中的地址

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

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

相关文章

SpringCloud-微服务概述、SpringCloud入门概述、服务提供与消费

1.学习前言 1.1 学习前提 熟练使用SpringBoot 微服务快速开发框架了解过Dubbo Zookeeper 分布式基础电脑配置内存不低于8G 1.2 文章大纲 Spring Cloud 五大组件 服务注册与发现——Netflix Eureka负载均衡&#xff1a; ​ 客户端负载均衡——Netflix Ribbon ​ 服务端负载…

KVM和JVM的虚拟化技术有何区别?

随着虚拟化技术的不断发展&#xff0c;KVM和JVM已成为两种主流的虚拟化技术。尽管它们都提供了虚拟化的解决方案&#xff0c;但它们在实现方式、功能和性能方面存在一些重要的差异。本文将深入探讨KVM和JVM的虚拟化技术之间的区别。 KVM&#xff08;Kernel-based Virtual Mac…

hive 创建表 字段类型

hive 创建表 字段类型 在Hive中创建表时可以指定不同的字段类型。常见的字段类型包括&#xff1a; 数值类型&#xff08;Numeric Types&#xff09;&#xff1a; TINYINT&#xff1a;8位有符号整数 SMALLINT&#xff1a;16位有符号整数 INT&#xff1a;32位有符号整数 BIG…

Select 选择器 el-option 回显错误 value

离谱 回显的内容不是 label 而是 value 的值 返回官方看说明&#xff1a; v-model的值为当前被选中的el-option的 value 属性值 value / v-model 绑定值有3种类型 boolean / string / number 根据自身代码猜测是&#xff1a;tableData.bookId 与 item.id 类型不一致导致 &…

H5/CSS 笔试面试考题(61-70)

简述下面语法中,哪个可以定义一个带正方形的列表? () A:list-style-image: square B:list-style-color: square C:list-type: square D:list-style-type: square 面试通过率:76.0% 推荐指数: ★★★★ 试题难度: 初级 试题类型: 选择题 答案:d 简述在 HTML 中,样…

问题:3【单选题】实现职业理想的一般步骤是()。 #媒体#媒体

问题&#xff1a;3【单选题】实现职业理想的一般步骤是()。 A、创业-立业-择业 B、择业-创业-立业 C、择业-立业-创业 D、立业-择业-创业 参考答案如图所示

【几分钟】快速熟悉torch.save()、torch.load()、torch.nn.Module.load_state_dict()

【几分钟】快速熟悉torch.save()、torch.load()、torch.nn.Module.load_state_dict() &#x1f335;文章目录&#x1f335; &#x1f333;引言&#x1f333;&#x1f333;torch.save()详解&#x1f333;&#x1f333;torch.load()详解&#x1f333;&#x1f333;torch.nn.Modul…

php文件请求

/** Common File Request Method */ $file $request->file(‘file’); $file->getClientOriginalName(); // Returns the original file name $file->getClientOriginalExtension(); // Returns the original file extension $file->getClientMimeType(); // Ret…

c++之说_11|自定义类型 enum(枚举)与enumclass (c11新枚举)

至于枚举 会用就行 至少目前我感觉没什么太多问题 enum 被称为无作用域枚举 &#xff0c; enumclass / enumstruct 被称为有作用域枚举 看到了吧 语法规则 和 struct 差不多 只不过枚举成员 只是一个标志 它本质是数值 从上到下 下面的数根据上面的数 加 1 也可以直接…

YUM | 包安装 | 管理

YUM 功能 软件包安装&#xff1a; 通过yum命令安装软件包。例如&#xff0c;安装一个名为 example-package 的软件包 yum install example-package更新包 检查更新&#xff1a; 检查可用更新&#xff1a; sudo yum check-update <package_name>软件包更新&#xff1a; y…

python_ACM模式《剑指offer刷题》二叉树2

题目&#xff1a; 面试tips&#xff1a; 面试官有可能问到&#xff1a; 如果你需要频繁地查找第 k 小的值&#xff0c;你将如何优化算法&#xff1f;&#xff08;见思路三&#xff09; 思路&#xff1a; 思路一&#xff1a;二叉搜索树最大的特点就是中序遍历是递增的。因此…

蓝桥杯每日一题------背包问题(一)

背包问题 阅读小提示&#xff1a;这篇文章稍微有点长&#xff0c;希望可以对背包问题进行系统详细的讲解&#xff0c;在看的过程中如果有任何疑问请在评论区里指出。因为篇幅过长也可以进行选择性阅读&#xff0c;读取自己想要的那一部分即可。 前言 背包问题可以看作动态规…

CTFSHOW命令执行web入门29-54

description: >- 这里就记录一下ctfshow的刷题记录是web入门的命令执行专题里面的题目,他是有分类,并且覆盖也很广泛,所以就通过刷这个来,不过里面有一些脚本的题目发现我自己根本不会笑死。 如果还不怎么知道写题的话,可以去看我的gitbook,当然csdn我也转载了我自己的…

12.3 OpenGL顶点后处理:平面着色

平面着色 Flatshading Flat shading (平面着色)是一种简化渲染技术&#xff0c;它在光栅化阶段将一个图元&#xff08;primitive&#xff09;的所有顶点赋予相同的颜色或其它输出变量的值。这些赋予的值来自于该图元的“引发顶点”&#xff08;provoking vertex&#xff09;。…

幻兽帕鲁服务器怎么更新?如何快速在腾讯云更新幻兽帕鲁Palworld服务器,显示版本不兼容怎么解决

幻兽帕鲁服务器怎么更新&#xff1f;如何快速在腾讯云更新幻兽帕鲁Palworld服务器&#xff0c;显示版本不兼容怎么解决。最近的幻兽帕鲁服务器又更新了。 如何在不需要远程登录服务器的情况下&#xff0c;通过一行命令来更新幻兽帕鲁呢&#xff1f; 腾讯云轻量云一键部署幻兽…

为什么说重载发生在编译期而重写发生在运行期

为什么说重载发生在编译期而重写发生在运行期 重载发生在编译期而重写发生在运行期。具体解释如下&#xff1a; 重载&#xff08;Overloading&#xff09;&#xff1a;是在同一类中发生的&#xff0c;编译器在编译时期就能根据方法名和参数列表确定调用哪个方法。因此&#x…

Android编程权威指南(第四版)- 第 4 章 UI状态的保存与恢复

文章目录 代码&#xff1a;依赖MainActivityQuizViewModelQuestion知识点 代码&#xff1a; 大体是一样的&#xff0c;修改了一些 依赖 implementation("androidx.lifecycle:lifecycle-extensions:2.2.0")MainActivity package com.example.geoquizimport android…

今年春节,德施曼成“春晚御用”智能锁,亮相总台春晚直播间

总台春晚&#xff0c;是每年春节期间的最大热点。 今年除夕夜&#xff0c;高端智能锁品牌德施曼&#xff0c;不仅成为“春晚御用”智能锁&#xff0c;还将旗下的哨兵猫眼智能锁&#xff0c;卖到了总台春晚的直播间里。龙年春节&#xff0c;德施曼智能锁携手小红书《大家的春晚》…

金融信贷风控评分卡模型

评分卡模型概念 评分模型是根据借款人的历史数据&#xff0c;选取不同维度的数据类型&#xff0c;通过计算而得出的对借款人信用情况打分的模型。不同等级的信用分数代表了借款人信用情况的好坏&#xff0c;以此来分析借款人按时还款的可能性。 评分卡模型分类 A卡&#xff…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月10日,星期六

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月10日 星期六 农历正月初一 春节 1、 国务院&#xff1a;到2025年&#xff0c;初步建成覆盖各领域、各环节的废弃物循环利用体系。 2、 国家移民管理局&#xff1a;部分国家人员可以用更多事由免签入境海南。 3、 市场…