类和对象的下篇

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary_walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互相支持,蟹蟹!
👑👑👑💎👑👑👑 

 目录:
一:构造函数的补充
二:static修饰的变量以及函数
三:友元
四:内部类
五:匿名对象
六:拷贝对象的一些优化
七:深度理解封装

1:构造函数的补充
1.1初始化列表

类的成员里面有const 修饰的时候,我们在定义构造函数的时候,是有问题的,若不对当前const 修饰的变量进行初始化

const 修饰的变量必须在进行声明的时候就进行初始化

为解决这一问题,引出了初始化列表这个概念

对于自定义类型的成员,引用类型的成员并且对应的改类没有默认构造函数的,也需要借助 初始化列表来进行完成

1.2 注意:

     1:每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次)
     2: 类中包含一些特殊的成员,必须放在初始化列表位置进行初始化

     3:不管是否显示在初始化列表中进行初始化,编译器都会默认在初始化列表中对所有是类的变量进行初始化

   4:初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。

   5:当定义的对象给出了初始化的值,在调用初始化列表的时候就会以给出的参数进行初始化,若是没有给出参数,就看看是否有缺省值,有的话使用缺省值,若是2个都没有编译器就会使用随机值

栗子见下:

 6:关于在初始化列表里面对类的成员进行初始化的先后顺序问题:是以类的成员定义的先后顺序进行初始化的

栗子见下:

 1.3 explicit关键字

对于自定义类型与内内置类型之间的转换的理解:

当我们不想让自定义类型与内置类型之间进行转换 的时候可以使用关键字 explicit

2:static修饰的变量以及函数
2.1概念

类的成员在生命的时候使用关键字static进行修饰,称之为类的静态成员

static修饰的函数称之为静态成员函数

注意对静态成员变量一定要在类的外面进行初始化

 2.2应用

 

 2.3 static 的特性

1.静态成员为所有的类对象共享,不属于某一个对象,是放在静态区的

2.静态成员变量必须在类外进行定义,定义时不能加关键字 static

3. 类的静态成员的访问:类名 :: 静态成员变量名字 或者对象.静态成员变量

4.静态成员函数是没有隐藏的this指针

5.静态成员也是类的成员,也受到访问限定符的限制

6. 静态成员函数可以调用静态成员变量

7.静态成员函数可以调用静态成员函数

8.非静态成员函数可以调用静态成员函数

3:友元
3.1概念

友元其实是打破了对类的封装:当我们对类的成员属性设置为private或者protected的时候,在类是不能直接进行访问的,这个时候借助友元函数或者友元类进OK

3.2友元类

友元类是单向的,不能双向互相访问

代码:

class Time
{
private:int _hour;int _min;int _sec;
public:friend class Date;//声明日期为时间的友元类(也就是Date里面可以访问Timel里面的私有成员)Time(int hour = 0,int min = 0,int sec = 0):_hour(hour),_min(min),_sec(sec){}
};
class Date
{
public:void Print(){cout << _year << '/' << _month << '/' << _day << endl;cout << _t._hour << ':' << _t._min<< ':' << _t._sec << endl;}Date(int year = 2024, int month = 4, int day = 2)//初始化列表:_year(year), _month(month), _day(day){cout << "Date()" << endl;}void SetTimeOfDate(int hour, int min, int sec){_t._hour = hour;_t._min = min;_t._sec = sec;}
private:int _year;int _month;int _day;Time _t;//自定义类型
};
int main()
{Date d(2024, 4, 3);d.SetTimeOfDate(21, 31, 42);d.Print();return 0;
}

运行结果:

 

3.3友元函数
lass Date
{
public://friend ostream& operator << (ostream& _cout, Date& d);//errfriend ostream& operator<< (ostream& _cout,const  Date& d);friend istream& operator>> (istream& _cin,  Date& d);Date(int year, int month, int day)//初始化列表:_year(year), _month(month),_day(day){}void Print(){cout << _year << '/' << _month << '/' << _day << endl;}/*ostream& operator << (ostream& _cout){_cout << _year << '/' << _month << '/' << _day << endl;return _cout;}*/
private:int _year;int _month;int _day;};
ostream& operator<< (ostream& _cout,const Date& d)
{_cout << d._year << '/' << d._month << '/' << d._day << endl;return _cout;
}
istream& operator>> (istream& _cin, Date& d)//注意第二个参数不能用const 修饰
{//一开始是不能对类外私有成员进行访问的,可以借助友元函数进行操作_cin >> d._year >>d._month>>d._day;return _cin;
}
int main()
{Date d1(2024, 4, 2);//cout << d1 << endl;//err 此时this 指针和_cout这个参数都进行抢占第一个参数的位置cin >> d1;cout << d1 << endl;return 0;
}

 

注意:

  1.友元函数不是类的成员,不属于任何类
  2.友元函数不属于该类的成员函数,它是定义在类外的普通函数,只是类中声明该函数可以直接访问类中的private或者protected成员  

  3.友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有声明。
  4.友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有声明。

4:内部类
概念: 如果一个类定义在另一个类的内部,这个内部类就叫做内部类 。内部类是一个独立的类,
它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越
的访问权限。
注意: 内部类是外部类的友元,但是外部类不一定就是内部类的友元 (看外部类是否进行友元的声明)

内部类的特点:

     1. 内部类可以定义在外部类的public、protected、private都是可以的。
    2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象 / 类名。
    3. sizeof(外部类) = 外部类,和内部类没有任何关系。 

     4. 内部类在空间上是与外部类相互独立的但是受到外部类的类域的限制

5:匿名对象

书写形式:类名 ()

6:拷贝对象的一些优化
在传参和传返回值的过程中,一般编译器会做一些优化, 减少对象的拷贝 ,以此提高效率

栗子见下:

7:深度理解封装
在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那的属性,以及方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化   具体的对象。
结语:

以上就是今日的share,对于类和对象下期的理解还是比较好容易的(当然是建立在前期:对类和对象上,中期的理解),希望各位老铁们可以有所收获!

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

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

相关文章

《Git版本控制管理》笔记

第三章 git --version查看版本号git --help查看帮助文档裸双破折号分离参数 git diff -w master origin – tools/Makefile将当前目录或任何目录转化为Git版本库 git init 初始化之后项目目录中&#xff0c;有名为.git的文件git status 查看git状态git commit 提供日志消息和作…

数据可视化:智慧农业发展的催化剂

数据可视化在智慧农业中发挥着不可替代的作用。随着科技的不断进步&#xff0c;农业领域也在不断探索创新&#xff0c;以提高生产效率、优化资源利用&#xff0c;从而实现可持续发展。而数据可视化技术的应用&#xff0c;则成为了实现智慧农业目标的重要途径。下面我就从可视化…

晚间兼职攻略:六个副业轻松上手

晚上兼职副业&#xff0c;作为增加额外收入的途径&#xff0c;选择多样且灵活。以下是六个特别适合晚上进行的副业&#xff0c;让你在闲暇时光也能充实自我&#xff0c;获得收益。 1&#xff0c;网络调查与市场研究是一个值得考虑的选项。你可以在晚上抽出空闲时间&#xff0c…

获取用户位置数据,IP定位离线库助您洞悉消费者需求

获取用户位置数据是现代互联网应用中非常重要的一环。通过获取用户的位置数据&#xff0c;可以了解用户所在的地理位置&#xff0c;从而更好地为用户提供个性化的服务和推荐。而IP归属地离线库就是一种非常有用的工具&#xff0c;可以帮助企业准确地获取用户的位置信息。 IP归…

Python控制浏览器——selenium模块

Python控制浏览器——selenium模块 目录 Python控制浏览器——selenium模块准备工作【1】安装selenium【2】安装浏览器驱动【3】测试驱动&#xff08;作者是Edge&#xff09; 导航和操作窗口导航返回前进刷新最大化窗口切换选项卡 查找和操作元素8种基本By定位方式[1]ID[2]Name…

HTML基础:脚本 script 标签

你好&#xff0c;我是云桃桃。 1枚程序媛&#xff0c;大专生&#xff0c;2年时间从1800到月入过万&#xff0c;工作5年买房。 分享成长心得。 255篇原创内容-公众号 后台回复“前端工具”可获取开发工具&#xff0c;持续更新中 后台回复“前端基础题”可得到前端基础100题汇…

[Linux] 排查问题指令top/ps/netstat

在Linux下查看某个端口运行的指令 1. 首先通过netstat来查看端口对应的进程号 比如抓取端口53这个DNS服务的进程 netstat -tulnp | grep 53 可以看到53这个端口号对应的pid是720 2. 通过ps指令来对进程号执行的命令查询 ps aux | grep 720 可以看到pid为720这个进程对应的执…

LEAP模型的能源环境发展、碳排放建模预测及不确定性分析教程

原文链接&#xff1a;LEAP模型的能源环境发展、碳排放建模预测及不确定性分析教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247599754&idx4&sn243c9f8bff355235a7056c2cbb1331fa&chksmfa82076dcdf58e7b871c3369c95ead9ff1d90baa0431318b26b6abd27…

如何使用生成式AI撰写论文?

撰写论文涉及几个关键步骤&#xff0c;以确保清晰、连贯和有效。以下是帮助您完成这一过程的指南&#xff1a; 选择一个主题&#xff1a;选择一个您感兴趣或熟悉的主题。确保主题具有足够的广度&#xff0c;可以进行多方面的讨论。明确您的论点&#xff1a;在开始写作之前&…

今日头条signature参数js逆向(爬虫)

今日头条是ajax动态加载 话不多说&#xff0c;直接上代码 windowglobal;window.location{"ancestorOrigins": {},"href": "https://www.toutiao.com/","origin": "https://www.toutiao.com","protocol": "…

基于springboot+vue实现的养老服务管理系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集

代码随想录算法训练营第四十二天 | 卡码网46. 携带研究材料、416. 分割等和子集 卡码网46. 携带研究材料题目解法 416. 分割等和子集题目解法 感悟 卡码网46. 携带研究材料 题目 解法 题解链接 二维数组 # include <bits/stdc.h> using namespace std;int n, bagweig…