类和对象补充

news2024/12/26 11:11:22

const 成员函数

const修饰的成员函数称之为const成员函数,const修饰成员函数放到成员函数参数列表的后面。

void Print() const
 {
 cout << _year << "-" << _month << "-" << _day << endl;
 }

为什么要用const进行修饰

使用const修饰主要就是权限放大缩小的问题,这里我们能看见这里显示报错,那么报错的报错的原因就是权限的放大,这里传入的时候限制是不能改变指向的内容,而接收的权限是可以改变指向的内容,因此涉及权限放大,为了解决这一问题只需要在函数的后面加上const即可把Data *const this ——>const Data *const this。

 const修饰的函数优缺点

通过const进行修改后,普通类型的也可以进行访问被const修饰的函数。这并不意味着所有的都可以这样设置,因为经过修饰后权限被缩小,只能读所指向的内容并不能所指向的内容进行修改。

案例如下:

取地址运算符重载

取地址运算符重载分为普通取地址运算符重载和const取地址运算符重载,⼀般这两个函数编译器自动生成的就可以够我们用了,不需要去显示实现。

Date* operator&()

{

        return this; 

}

const Date* operator&()const

{

        return this; 

}

再探构造函数

初始化列表

初始化列表的使用方式式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成员列表,每个"成员变量"后面跟⼀个放在括号中的初始值或表达式。注意:每个成员变量在初始化列表中只能出现⼀次

Date(int year = 1, int month = 1, int day = 1)

         :_year(year)

        ,_month(month)

        ,_day(day)

必须使用初始化列表的三种情况

引用成员变量,const成员变量,没有默认构造的类类型成员变量。为什么以上三种要用初始化列表,因为引用必须在定义的时候进行初始化,const也是在初始化的那一刻才能进行初值的改变,没有默认构造,调用的时候需要传参,传参就要初始化,初始化只能在初始化列表中,因为在函数体成员可以出现多次那么到底那个是初始化,这就产出了问题,所以通俗说初始化列表可以认为是每个成员变量定义初始化的地方

面试题分析

初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序和初始化列表顺序保持⼀致。此题先按照声明的顺序,先执行_a2(),此时a1还未进行传入,这时_a2就会显示随机值,_a1为1。

初始化列表总结

类型转换   

C++⽀持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。如我们学过的指针(虽然存放的是地址,也是有编号)可以和数据类型进行相互转换。

什么是隐式类型转换

A类只有一个单参数的构造函数,因此该构造函数是支持隐式类型转换的,A aa1 = 1;本质上就是隐式类型转换,首先在隐式转换过程中会产生一个临时的中间变量,用1去调用构造函数,得到一个A类型的临时中间变量,然后再用这个A类型的中间变量去调用拷贝构造,最终完成aa1的创建。

#include<iostream>
using namespace std;
class A
{
public:
	// 构造函数explicit就不再⽀持隐式类型转换 
	// explicit A(int a1)
	A(int a1)
		:_a1(a1)
	{}
	
	A(int a1, int a2)
		:_a1(a1)
		, _a2(a2)
	{}
	void Print()
	{
		cout << _a1 << " " << _a2 << endl;
	}
private:
	int _a1 = 1;
	int _a2 = 2;
};

int main()
{
	
	A aa1 = 1;
	aa1.Print();
    //用于检测是否创建了中间变量
    //临时对象具有常性,不能放大权限,如果创建了不加const限定就会报错
    
	//const A& aa2 = 1;
	
	return 0;
}

explicit的用法

构造函数前加explicit就不再支持隐式类型转换

用法如下:explicit A(int a1)

static关键字

static成员变量的用法

  1. 用static修饰的成员变量,称之为静态成员变量,静态成员变量⼀定要在类外进行初始化。在类外初始化要记得加上类域这要就知道是静态成员变量。
  2. 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区。
  3.  静态成员也是类的成员,受public、protected、private访问限定符的限制。
  4.  静态成员变量不能在声明位置给缺省值初始化,因为缺省值是构造函数初始化列表的,静态成员 变量不属于某个对象,不⾛构造函数初始化列表。

static成员函数的特点

  1. 用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。
  2. 静态成员函数中可以访问其他的静态成员,但是不能访问⾮静态的,因为没有this指针。
  3. 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。
  4. 突破类域就可以访问静态成员,可以通过类名::静态成员或者对象.静态成员来访问静态成员变量 和静态成员函数。

面试小案列

 构造函数的调用顺序是 :先全局然后按照声明的顺序进行构造函数的调用,因此构造函数的调用   顺序为:   C A B D。

析构函数调用的顺序:按照后构造的先析构,最后析构全局的构造函数。所以顺序为:B A D C。

友员补充

友元函数

  1. 在函数声明或者类 声明的前面加friend,并且把友元声明放到⼀个类的里面。
  2.  外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。
  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制。
  4. ⼀个函数可以是多个类的友元函数。

友元类

  1. 友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。
  2. 友元类的关系是单向的,不具有交换性,如A类是B类的友元,但是B类不是A类的友元。
  3. 友元类关系不能传递,如果A是B的友元,B是C的友元,但是A不是C的友元。
  4. 有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

 内部类

内部类就是把一个类写在另一个类的里面,这种就叫做内部类。他只是受外部类类域限制和访问限定符限制。内部类并不占用所写入类的字节大小。

注意:内部类默认是外部类的友元类。因此在访问静态成员变量的时候可以直接使用,普通的成员需要引用外部类名。内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使用。在内部类上加上private/protected专属内部类,其他地方就无法使用了。

#include<iostream>
using namespace std;
class A
{
   private:
     static int _k;
     int _h = 1;
   public:
     class B // B默认就是A的友元 
     {
         public:
            void foo(const A& a)
            {
             cout << _k << endl; 
             cout << a._h << endl; 
            }
        private:
            int b=1;
     };
};

int A::_k = 1;
int main()
{
 cout << sizeof(A) << endl;
 A::B b;
 A aa;
 b.foo(aa);
 return 0;
}

 匿名对象

没有名字的对象通常写成类型(实参)。匿名对象生命周期只在当前一行,而有名对象的生命周期是这个main()函数调用结束。匿名对象可以引用,引用后就具有了常性,需要加const加完const之后生命周期变长。

class A

{

        public:

                A(int a = 0)

                        :_a(a)

                {

                        cout <<"A(int a)"<<endl;

                }

                ~A()

                {

                        cout <<"~A()"<<endl;

        private:

                int _a;

};

int main()

{

        //匿名对象的使用方式

        A();

        A(1);

}

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

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

相关文章

SpringDoc介绍

一、SpringDoc 官方文档 1.1何为SpringDoc SpringDoc是一个用来自动生成API文档的库。它是基于SpringBoot项目的&#xff0c;遵循OpenAPI3(一个组织规定的规范)规范。它是通过检查我们运行中的程序&#xff0c;推断出基于Spring配置、类结构和各种注解的API语义&#xff0c;从…

介绍一些免费 的 html 5模版网站 和配色 网站

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、H5 网站介绍网站 二、配色网站个人推荐 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、H5 网站介绍 以下是一些提供免费…

系统优化工具 | TweakPower v2.0.6 绿色版

TweakPower 是一款专业的系统优化工具&#xff0c;它为Windows用户提供了全面的系统性能提升解决方案。这款软件通过精细调整系统设置&#xff0c;包括注册表项&#xff0c;来显著提高电脑的运行速度和整体性能。 全面优化&#xff1a;提供内存管理、垃圾清理、数据备份、硬盘…

从 Prompt 工程看职场PUA!明明是模型缺陷,为啥要 Prompt 雕花?

简介 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖豆沙饼的小女孩。在当今的人工智能领域&#xff0c;Prompt 工程已被视为一项重要技能。然而&#xff0c;这一趋势也揭示了当前模型的不足&#xff1a;一个强大的模型应当能够直接理解用户明…

20240916 每日AI必读资讯

超强o1模型智商已超120&#xff01;1小时写出NASA博士1年代码&#xff0c;最新编程赛超越99.8%选手 - 一位UCI物理学博士实测o1&#xff0c;发现自己用时1年完成的博士论文代码&#xff0c;竟被AI在1个小时之内实现了。 - o1在最新门萨智商测试中&#xff0c;IQ水平竟超过了1…

Fish Speech - 新的 TTS 解决方案

文章目录 一、关于 Fish Speech架构Fish Speech V1.1 技术介绍[视频] 二、配置1、Linux 配置2、Docker 配置 三、快速开始1、设置For Windows User / win用户For Linux User / Linux 用户 2、准备模型3、WebUI Inference 四、Break-down CLI Inference1、从语音生成 prompt:2、…

鸿蒙开发之ArkTS 基础四 函数

函数 function 是可以重复使用的代码块 提高开发效率 &#xff0c;例如下面代码: 我需要执行无变&#xff0c;最方便的就是封装到一个方法里面 然后调用五次 fn()方法即可 如图&#xff1a; 函数的步骤是先定义函数 然后使用函数 定义的语法格式是: function 函数名字(){ 函…

Linux命令:文本处理工具sed详解

目录 一、概述 二、用法 1、基本语法 2、常用选项 3、命令格式 4、编辑命令 5、获取帮助 三、 示例 1、替换字符串 2、删除行 &#xff08;1&#xff09;删除包含"string"的所有行 ​编辑 &#xff08;2&#xff09;删除从第1行到第10行的所有行 3、插…

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 死亡对象判断方法

文章目录 垃圾回收机制死亡对象判断方法引用计数法可达性分析算法可以作为 GC Roots 的对象判断对象被回收需要经历的过程 引用类型引用汇总引用队列 废弃常量判定废弃常量废弃原因遵循原则 无用的类所需条件造成的问题解决步骤 垃圾回收机制 垃圾回收&#xff08;Garbage Col…

Anaconda安装并配置Python环境

背景概述 Anaconda&#xff0c;中文大蟒蛇&#xff0c;是一个开源的Anaconda是专注于数据分析的Python发行版本&#xff0c;包含了conda、Python等190多个科学包及其依赖项。 Anaconda就是可以便捷获取包且对包能够进行管理&#xff0c;包括了python和很多常见的软件库和一个…

[OpenCV] 数字图像处理 C++ 学习——15像素重映射(cv::remap) 附完整代码

文章目录 前言1.像素重映射理论基础2.代码实现(1) remap()细节(2)水平翻转(2)垂直翻转(3)旋转 180 度(4)径向扭曲 3.完整代码 前言 像素重映射将图像中的每个像素映射到新位置&#xff0c;实现图像的扭曲、校正等操作。在 OpenCV 中&#xff0c;cv::remap() 函数就是用于实现这…

java实现系统文件管理

java实现系统文件管理 环境&#xff1a;jdk17springbootVueElementUI 背景&#xff1a;公司所做的项目需要别的系统向我们服务器上传文件&#xff0c;当我们需要查看这些文件什么时候上传的、文件数据是怎样的&#xff0c;只能去机房&#xff0c;排查问题效率较低&#xff0c;…

Redis复习笔记整理

目录 1、Redis简介 1.1 补充数据类型Stream 1.2 Redis底层数据结构 1.3 Redis为什么快 1.4 持久化机制* 1.4.1 RDB持久化 bgsave执行流程 如何保证数据一致性 快照操作期间服务崩溃 RDB优缺点 1.4.2 AOF持久化 为什么采用写后日志 如何实现AOF 什么是AOF重写 AO…

期末满分之模拟实现字符串函数

&#xff08;一&#xff09;strcpy 首先我们来了解该函数的使用方式 最简单的理解就是“复制粘贴”&#xff0c;比如现在有一个数组arr1&#xff0c;存放着 hello &#xff1b;还有一个数组arr2&#xff0c;存放着 boy &#xff1b;那么使用该函数之后&#xff0c;形如 strcpy&…

小米,B站网络安全岗位笔试题目+答案

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

mongoDB-1

文章目录 一、疑似坑1.11.2 mongo ops manager 一、疑似坑 1.1 https://www.bilibili.com/video/BV1H1421R7WD 2.x开始用&#xff0c;现在应该6.x了吧&#xff0c;早期四处鼓吹&#xff0c;为公司打造全mongo服务&#xff0c;为并发几千做了优化&#xff0c;原本打算替代MySQ…

【C++】——list

文章目录 list介绍和使用list注意事项 list模拟实现list和vector的不同 list介绍和使用 在C中&#xff0c;list是一个带头双向链表 list注意事项 迭代器失效 删除元素&#xff1a;当使用迭代器删除一个元素时&#xff0c;指向该元素的迭代器会失效&#xff0c;但是不会影响其他…

订单防重复提交:token 发放以及校验

订单防重复提交&#xff1a;token 发放以及校验 1. 基于Token校验避免订单重复提交 1. 基于Token校验避免订单重复提交 在很多秒杀场景中&#xff0c;用户为了能下单成功&#xff0c;会频繁的点击下单按钮&#xff0c;这时候如果没有做好控制的话&#xff0c;就可能会给一个用…

ElementUI 布局——行与列的灵活运用

ElementUI 布局——行与列的灵活运用 一 . 使用 Layout 组件1.1 注册路由1.2 使用 Layout 组件 二 . 行属性2.1 栅格的间隔2.2 自定义元素标签 三 . 列属性3.1 列的偏移3.2 列的移动 在现代网页设计中&#xff0c;布局是构建用户界面的基石。Element UI 框架通过其强大的 <e…

面向对象程序设计之继承(C++)

1.继承的定义 1.1继承的概念 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有类特性的基础上进⾏扩展&#xff0c;增加⽅法(成员函数)和属性(成员变量)&#xff0c;这样产⽣新的类&#xff0c;称派⽣类。继承 呈现了⾯向…