【04】C++ 类和对象 3

文章目录

  • 🌈 Ⅰ const 修饰 this 指针
  • 🌈 Ⅱ static 静态成员
  • 🌈 Ⅲ friend 友元
    • 1. 友元函数
    • 2. 友元类
  • 🌈 Ⅳ 内部类
  • 🌈 Ⅴ 匿名对象

🌈 Ⅰ const 修饰 this 指针

1. const 成员函数概念

  • 将 const 修饰的 成员函数 称之为 const 成员函数,const 修饰类的成员函数,实际是修饰该成员函数隐含的 this 指针,表明在该成员函数中不能修改类的任何成员变量

2. const 成员函数格式

[返回值类型] 函数名(形参列表) const
{函数体
}

.3. const 成员函数示例

class date
{
public:date(int year = 1, int month = 1, int day = 1):_year(year),_month(month),_day(day){}void Print() const	{// const 修饰隐含的 this 指针,防止改变对象的内容// 只想打印对象 d 内的值,不期望也不允许去改变cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{const date d(2024, 2, 8);	// const 修饰的对象 d 的值不允许被改变d.Print();return 0;
}

4. const 成员函数特点

  1. const 对象 不能 调用非 const 成员函数,会放大 const 对象的权限。
  2. 非 const 对象 可以 调用 const 成员函数,将对象传给函数时,会缩小权限。
  3. 在 const 成员函数内 不能 调用其他的非 const 成员函数。
  4. 非 const 成员函数 可以 调用其他的 const 成员函数。

🌈 Ⅱ static 静态成员

1. static 静态成员概念

  • 用 static 修饰的类的成员称为类的静态成员
  • 用 static 修饰ide成员变量称为静态成员变量;用 static 修饰的的成员函数称为静态成员函数。
  • 静态成员变量只能在类外面进行初始化
class date
{
public:date(int month, int day){_month = month;_day = day;}
private:static int _year;int _month;int _day;
};int date::_year = 2024;	// _year 是静态成员变量,只能在类外初始化int main()
{date d(2, 8);return 0;
}

static 静态成员特性

  1. 静态成员为所有类对象共享,不属于某个具体的对象,存放在静态区。
  2. 静态成员变量必须定义在类外,定义时不需要加上 static,类中的只是声明。
  3. 类的静态成员可以用类名::静态成员对象.静态成员访问。
  4. 静态成员函数没有隐藏的this 指针,不能访问任何非静态成员。
  5. 静态成员也是类的成员,也受到访问限定符的限制。

🌈 Ⅲ friend 友元

  • friend 友元提供了一种突破封装的方式,使得与某个类无关的其他类和函数能够访问该类的非公有成员。

1. 友元函数

  • 在类内部对外部函数进行友元声明,使得外部函数能够访问类的非公有成员。
class date
{
public:date(int year = 1, int month = 1, int day = 1):_year(year),_month(month),_day(day){}// 将外部函数 Display 声明成 date 类的朋友friend void Display(const date& d);private:int _year;int _month;int _day;
};void Display(const date& d)
{// Display 函数是 date 类的朋友的话就能使用 date 类的私有成员了printf("%d-%d-%d\n", d._year, d._month, d._day);
}int main()
{date d(2024, 2, 8);Display(d);return 0;
}

2. 友元类

  • 使用方法和友元函数类似,现有 A、B 两个类,单方面将类 B 声明成类 A 的友元类的话,类 B 就能使用类 A 的非公有成员,而类 A 却不能使用类 B 的非公有成员。
class Time
{
public:friend class Date;	// Time 认为 Date 是它的朋友// 但 Date 不认为 Time 是它的朋友,Time 无法使用 Date 的非公有成员Time(int hour = 1, int minute = 1, int second = 1):_hour(hour),_minute(minute),_second(second){}private:int _hour;int _minute;int _second;
};class Date
{
public:Date(int year = 1, int month = 1, int day = 1):_year(year),_month(month),_day(day){}// Date 没有对 Time 进行友元类声明// Date 可以使用 Time 的非公有成员void PrintTime(const Time& t){printf("%d-%d-%d\n", t._hour, t._minute, t._second);}
private:int _year;int _month;int _day;
};

🌈 Ⅳ 内部类

内部类概念

  • 顾名思义,定义在类内部的类。
  • 内部类是一个独立的类,它不属于外部类。
  • 内部类天生就是外部类的友元类

内部类特性

  • 内部类可以定义在外部类的 public、protected、private 各个限定区域。
  • 内部类可直接访问外部类的 static 成员。
  • sizeof(外部类) 计算的是外部类的大小,和内部类没有任何关系。

内部类实例化方式

外部类::内部类 实例化的对象;

内部类示例

class A
{
public:class B	// B  天生就是 A 的友元类{public:void Print(const A& a){cout << a.h << k << endl;// 内部类可直接访问外部类的 static 成员}};
private:int h;static int k;
};int A::k = 1;int main()
{A::B b;b.Print(A());return 0;
}

🌈 Ⅴ 匿名对象

匿名对象概念

  • 不用类来进行实例化对象然后用对象传参,而是直接使用类名进行传参。
  • 在某些只是为了传个参数的地方可以使用。
  • 匿名对象的生命周期只有它所在的那一行。

匿名对象示例

class A
{
public:A(int a):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}private:int _a;
};int main()
{A(5);	// 匿名对象存在的意义就是为了传一下参数,所以生命周期只有 1 行// 等到了下一行会立马调用析构函数return 0;
}

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

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

相关文章

云卷云舒:谈云数据库的备份容灾

备份和容灾是云数据库的标配&#xff0c;是实现数据恢复、保护的关键。 一、数据库备份原理和策略 &#xff08;1&#xff09;灾备方案设计&#xff1a;根据业务需求和数据的重要性&#xff0c;对不同级别业务数据库采用定制的备份策略&#xff0c;并且把备份存储在不同的AZ或…

「深度学习」长短时记忆网络LSTM

一、经典模型 \widetilde{c}^{<t>} tanh(w_{c}[a^{<t-1>},x^{<t>}]b_{c}) 更新门&#xff1a;\Gamma_{u} \sigma(w_{u}[a^{<t-1>},x^{<t>}]b_{u}) 遗忘门&#xff1a;\Gamma_{f} \sigma(w_{f}[a^{<t-1>},x^{<t>}]b_{f}) 输出门…

svg 进阶

svg 进阶 svg 应用场景 绘制 icon绘制动画 svg viewport 和 viewBox viewport 是 svg 图像的可见区域 viewBox 是用于在画布上绘制 svg 图形的坐标系统 在一下案例中 svg中 width“500” height“200” 就是可视区域 比如你的svg是100X100但是你的可视区域只有20X20 那么他…

职业性格测试在求职应聘跳槽中的应用

人的性格总是千奇百怪&#xff0c;有的人总是想迎接挑战&#xff0c;超越自己&#xff0c;不停的奔着高处走&#xff0c;然而有的人总是喜欢随遇而安&#xff0c;踏踏实实一辈子&#xff0c;有份安稳的工作&#xff0c;有吃有喝就好。那么对于哪些喜欢迎接挑战&#xff0c;但又…

《MySQL 简易速速上手小册》第4章:数据安全性管理(2024 最新版)

文章目录 4.1 用户认证和权限控制4.1.1 基础知识4.1.2 重点案例&#xff1a;使用 Python 管理 MySQL 用户权限4.1.3 拓展案例 4.2 防止 SQL 注入和其他安全威胁4.2.1 基础知识4.2.2 重点案例&#xff1a;使用 Python 和 MySQL 进行安全的数据查询4.2.3 拓展案例 4.3 数据加密和…

边缘人工智能的发展 —— 边缘AI图形化开发

1、背景 边缘人工智能是指直接在边缘设备上运行的机器学习算法的形式使用人工智能。这里的“边缘设备”指的是网络边缘的设备&#xff0c;例如智能手机、传感器、工业机器人等。这些设备具备数据处理和机器学习算法运行的能力&#xff0c;可以在本地进行必要的数据操作并发送&…

Android Studio无法安装Git问题解决(折中方案)

安装配置好studio&#xff0c;往往会使用git克隆github上面的项目&#xff0c;但是却发现git无法正确安装&#xff0c;本文将介绍如何解决git无法安装这一问题。 对于git安装&#xff0c;实际比较复杂&#xff0c;可以参考这一篇博客。 Git 详细安装教程&#xff08;详解 Gi…

二维差分---三维差分算法笔记

文章目录 一.二维差分构造差分二维数组二维差分算法状态dp求b[i][j]数组的二维前缀和图解 二.三维前缀和与差分三维前缀和图解:三维差分核心公式图解:模板题 一.二维差分 给定一个原二维数组a[i][j],若要给a[i][j]中以(x1,y1)和(x2,y2)为对角线的子矩阵中每个数都加上一个常数…

Java SE多态

文章目录 1.多态&#xff1a;1.1.什么是多态&#xff1a;1.2.多态实现条件&#xff1a;1.2.1.重写&#xff1a;1.2.2.向上转型&#xff1a; 1.多态&#xff1a; 1.1.什么是多态&#xff1a; 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去…

54.螺旋矩阵(Java)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 输入&#xff1a; matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a; [1,2,3,6,9,8,7,4,5] 代码实现&#xff1a; import java.util.ArrayLi…

【数据结构与算法】力扣刷题记之 稀疏数组

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

总结:图像生成网络

1、最新的几款图像生成网络 eCNN 文献&#xff1a;Bahrami A, Karimian A, Fatemizadeh E, et al. A new deep convolutional neural network design with efficient learning capability: Application to CT image synthesis from MRI[J]. Medical physics, 2020, 47(10): 515…

Qt PCL学习(三):点云滤波

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建、Qt PCL学习&#xff08;二&#xff09;&#xff1a;点云读取与保存 0. 效果演示 1. pcl_open_save.pro QT core guigr…

包装效果图为何要用云渲染100?渲染100邀请码1a12

包装效果图能吸引用户注意力&#xff0c;提升销量&#xff0c;随着技术的发展&#xff0c;越来越多的设计师开始使用云渲染来处理效果图&#xff0c;云渲染有什么优势呢&#xff1f;以渲染100为例我来说下。 1、节省时间和成本 渲染100拥有超过10万台的高性能渲染节点&#x…

C语言---计算n的阶乘

阶乘的概念&#xff1a;一个正整数的阶乘&#xff08;factorial&#xff09;是所有小于及等于该数的正整数的积&#xff0c;且0的阶乘为1&#xff0c;自然数n的阶乘写作n! 。 任何大于等于1 的自然数n 阶乘表示方法&#xff1a; n!123…(n-1)n 或 n!n(n-1)! 0&#xff01;1 …

【C语言】案例:输出n位水仙花数

1.题目 输入一个整数n&#xff0c;输出所有n位的水仙花数 2.代码 #include <stdio.h> #include <math.h>// 计算数字的位数 int countDigits(int num) {int count 0;while (num ! 0) {num / 10;count;}return count; }// 计算水仙花数 void findNarcissisticNu…

【Larry】英语学习笔记语法篇——换一种方式理解词性

目录 一、换一种方式理解词性 1、名词、形容词、副词&#xff0c;这就是一切 2、词性之间的修饰关系 3、介词其实很简单 形容词属性的介词短语 副词属性的介词短语 ①修饰动词 ②修饰形容词 ③修饰其他副词 一、换一种方式理解词性 1、名词、形容词、副词&#xff0c…

(基础算法)归并排序

1.确定分界点 mid &#xff08;lr&#xff09;/2 2.递归排序左右两段 3.归并----合二为一 #include<iostream> using namespace std; //归并排序----分治 const int N10010; int n; int q[N],tmp[N];//需要一个额外数组void mergesort(int q[],int l,int r)//l左边界&a…

TCP 传输控制协议——详细

目录 1 TCP 1.1 TCP 最主要的特点 1.2 TCP 的连接 TCP 连接&#xff0c;IP 地址&#xff0c;套接字 1.3 可靠传输的工作原理 1.3.1 停止等待协议 &#xff08;1&#xff09;无差错情况 &#xff08;2&#xff09;出现差错 &#xff08;3&#xff09;确认丢失和确认迟到…

【MySQL进阶之路】BufferPool底层设计(下)

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…