【C++】类与对象(下篇)

在本篇博客中,作者将会讲解类与对象的最后一篇。

 一.再谈构造函数

在类与对象(上篇)中,我们讲到了构造函数,其实构造函数就是给每个成员变量进行赋值!!!

仅仅只是赋值而已,并不算严格意义上的初始化

#include<iostream>
using namespace std;class Date
{
public://实例化对象时,同时给成员变量赋值Date(int year = 0, int month = 1, int day = 1){_year = year;_month = month;_day = day;}void Show(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Show();return 0;
}

初始化列表 

 既然普通构造函数并不是初始化,那么什么才是初始化呢?答案是初始化列表

#include<iostream>
using namespace std;class Date
{
public://初始化列表用法Date(int year = 0, int month = 1, int day = 1):_year(year),_month(month),_day(day){}void Show(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};int main()
{Date d1;d1.Show();return 0;
}

为什么要有初始化列表呢?因为有些成员变量不能通过普通构造函数来赋值:如:引用变量、const常量、自定义类型(且该类没有默认构造函数)。 

#include<iostream>
using namespace std;class Date
{
public://无默认构造函数(默认构造函数是指:不需要传参的的构造函数)Date(int year,int month,int day):_year(year),_month(month),_day(day){}void Show(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};class Temp
{
public:Temp(int& ptmp):_a(ptmp),_b(10),_d(0,0,0){}void Show(){cout << _a << " " << _b << endl;}
private://必须要用初始化列表的三个成员变量int& _a;const int _b;Date _d;//自定义类型,且无默认构造函数
};int main()
{int tmp = 0;Temp t1(tmp);return 0;
}

最后,初始化列表的初始化顺序与构造函数的初始化列表无关,与成员变量的定义先后有关 

二.static成员

static成员变量

被static修饰的成员变量称为静态成员变量,静态成员变量不属于某个实例化对象,它是所有类对象共享的。且静态成员变量不能在类中初始化,必须在类外初始化

#include<iostream>
using namespace std;class Date
{
private:int _year;static int count;
};int Date::count = 0;int main()
{return 0;
}

static成员函数

被static修饰的成员函数没有this指针。在前面讲到,类的成员函数都会带上一个默认的this指针,而被static修饰的成员函数没有this指针。 

三.友元 

友元函数

什么是友元函数?

我们知道在C++类中,成员变量都会有一个访问修饰符,其中private和protect是私有和保护的,被这两个修饰的成员变量不能被类外部访问,只能被类内部访问,那么如果我们想在外部用函数来对类内部的成员变量进行访问,就可以用友元函数。

#include<iostream>
using namespace std;class Date
{//声明Show是友元函数friend void Show(const Date& d);
public:Date(int year=0,int month=1,int day=1):_year(year),_month(month),_day(day){}
private:int _year;int _month;int _day;
};void Show(const Date& d)//可以在类外部访问类内部的成员变量
{cout << d._year << "-" << d._month << "-" << d._day << endl;
}int main()
{Date d1(2024, 3, 24);Show(d1);return 0;
}

看到这里,可能会有人疑惑,我直接在类内部定义一个Show函数就好了吗,为什么还要搞一个友元函数?因为有一些地方必须要用到友元函数。 

友元函数重载<<

在C++中,如果我们想输出某个内置类型变量,直接cout<< 变量名即可,那如果我们想输出自定义类型,则需要额外写一个Show函数,而且每次都要调用该类的函数,那么有没有办法可以使用 cout<<类实例化对象 这样的方式来实现输出了,答案是可以的。


 在类与对象(中篇)中,我们讲到了操作符重载,即我们可以重载<<这个操作符来实现。

常规做法实现
#include<iostream>
using namespace std;class Date
{
public:Date(int year=0,int month=1,int day=1):_year(year),_month(month),_day(day){}ostream& operator<<(ostream& out)//重载<<操作符{cout << _year << "-" << _month << "-" << _day << endl;return out;}
private:int _year;int _month;int _day;
};int main()
{Date d1(2024, 3, 24);Date d2(2024, 3, 25);d2 << (d1 << cout);return 0;
}

我们可以发现如果在类中定义重载<<操作符,会发现,它的使用方式和常规使用方式不同,它是反过来的,因为在operator<<函数中,会默认有个this指针占了第一个参数的位置,同时d1<<cout 等价于 d1.operator<<(&d1,cout),导致<<使用方法与原本相反,这时,我们就需要使用友元函数来解决。 

友元函数实现 

通过使用友元函数的实现可以达到我们想要的效果。  


 友元类

友元类就是,A类是B类的朋友,所以A类可以突破访问权限限制,可以去访问B类的非公有成员变量。

#include<iostream>
using namespace std;class Time
{friend class Date;//声明Date类是它的朋友
public:Time(int hour=0,int min=0,int second=0):_hour(hour),_min(min),_second(second){}
private:int _hour;int _min;int _second;
};class Date
{
public:Date(int year,int month,int day):_year(year),_month(month),_day(day){}void SetTime(int hour, int min, int second)//这个函数可以突破访问权限去访问Time的成员变量{_t._hour = hour;_t._min = min;_t._second = second;}
private:int _year;int _month;int _day;Time _t;
};int main()
{Date d1(2024, 3, 24);d1.SetTime(0, 0, 0);return 0;
}

但是这种关系是单向的,Date可以去访问Time,而Time不能去访问Date。同时友元关系不能传递,也不能继承。 

四.匿名对象

匿名对象就是使用类来实例化一个匿名的对象,这个匿名的对象可以直接调用类种的成员函数,但是它的生命周期只有在定义它的那一行

#include<iostream>
using namespace std;class Solution
{
public:int GetSum(int n){return n;}
};int main()
{Solution().GetSum(10);//实例化一个匿名类去知道调用它的成员函数return 0;
}

 

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

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

相关文章

阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素。 阿里云2核4G服务器多少钱一年&#xff1f;2核4…

地宫取宝dfs

分析&#xff1a; 矩阵里的每一个位置都有标记&#xff0c;要求的问题是&#xff1a;有几种方法能完成这个规定。 那么&#xff0c;我们只需要计算从开始(1,1)到最后(n,m)的深度优先搜索中&#xff0c;有几个是满足要求的即为正确答案。 有个要求是&#xff0c;如果一个格子中…

Docker-镜像仓库

Docker ⛅Docker-Registry&#x1f320;分类&#x1f320;镜像仓库工作机制&#x1f320;常用的镜像仓库&#x1f320;镜像仓库命令☃️docker login☃️docker pull☃️docker push☃️docker search☃️docker logout &#x1f320;镜像命令[部分]☃️docker images☃️docke…

Git工具的详细使用

一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义&#xff1a;通过定义策略和规则来限制哪些流量能经过防火墙&#xff0c;哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…

【赠书活动】Python编程 从入门到实践 第3版(图灵出品)(文末送书-进行中)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

2-dubbo源码 : 源码环境搭建

好的开始是成功的一半&#xff0c;阅读源码也是一样。 很多同学在下定决心阅读一个开源框架之后&#xff0c;就一头扎进去&#xff0c;迷失在代码“迷宫”中。此时&#xff0c;有同学意识到&#xff0c;需要一边 Debug 一边看&#xff1b;然后又有一批同学在搭建源码环境的时候…

学习C++是否有必要学习Boost库?

C作为一门强大且灵活的编程语言&#xff0c;在软件开发领域有着广泛的应用。而在C的学习过程中&#xff0c;Boost库是一个经常被提及的重要资源。那么&#xff0c;对于C的学习者而言&#xff0c;是否有必要投入精力去学习Boost库呢&#xff1f;本文将就此问题展开详尽讨论。 一…

论文:Zero-Shot Entity Linking by Reading Entity Descriptions翻译笔记(阅读实体描述、实体链接)

文章目录 论文题目&#xff1a;通过阅读实体描述实现零样本实体链接摘要1 介绍2 零点实体链接2.1 审查&#xff1a; 实体链接2.2 任务定义2.3 与其他 EL 任务的关系 3 数据集构建4 实体链接模型4.1 生成候选4.2 候选排序 5 适应目标世界6 实验6.1 基线6.2 对未知实体和新世界6.…

C++例子

#include<iostream> using namespace std;//抽象类 //抽象cpu类 class CPU { public:virtual void calcuate()0; }; //抽象显卡类 class VideoCard { public:virtual void display()0; }; //抽象内存条类 class Memory { public:virtual void storage()0;};//电脑类 clas…

【计算机网络】物理层

文章目录 第二章 物理层一、 物理层的基本概念1. 物理层接口特性 二、数据通信基础1. 典型的数据通信模型2. 数据通信相关术语3. 设计数据通信系统要考虑的3个问题4. 三种通信方式5. 串行传输&并行传输6. 同步传输&异步传输7. 码元8. 数字通信系统数据传输速率的两种表…

rpc详解rpc框架

文章目录 概述rpc的优点组件工作流程&RPC的底层原理RPC的底层原理 RPC框架rpc框架优点RPC 的实现基础RPC的应用场景RPC使用了哪些关键技术rpc 调用异常一般怎么处理rpc和http的区别为什么RPC要比HTTP更快一些Dubbo和openfeign 区别远程调用RPC框架传输协议传输速度 概述 在…

MySQL:存储过程

1. 概念 MySQL中的存储过程指的是存储在数据库中的SQL语句集合。当创建好存储过程后&#xff0c;在运行时提供所需参数&#xff0c;存储过程就可以以代码指定的方式使用参数执行并返回值。 存储过程的特点包括&#xff1a; 封装与复用&#xff1a;可以把某一业务SQL封装在存储过…

2024年三分钟教你激活CleanMyMac v4.15.1破解版下载图文激活教程

软件介绍 CleanMyMac 系列最新X测试版本&#xff0c;CleanMyMac应该是世界上最容易使用且最强大的Mac实用系统清理工具&#xff0c;CleanMyMac X是一款集所有功能于一身的先进程序卸载清理器&#xff0c;只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&…

使用JavaScript控制<video>视频播放

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 HTML 元素 用于在 …

每日一题 --- 移除链表元素[力扣][Go]

移除链表元素 题目&#xff1a;203. 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xf…

Java——抽象类和接口

目录 1.抽象类 1.概念: 2.语法 3.特性 2.接口 1.概念 2.语法 3.特性 1.抽象类 1.概念: 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的…

ClickHouse部署安装

准备工作 确定防火墙处于关闭状态 CentOS取消打开文件数限制 在hadoop102的 /etc/security/limits.conf文件的末尾加入以下内容 注意&#xff1a;以下操作会修改 Linux 系统配置&#xff0c;如果操作不当可能导致虚拟机无法启动&#xff0c;建议在执行以下操作之前给…

sentinel中StatisticSlot数据采集的原理

StatisticSlot数据采集的原理 时间窗口 固定窗口 在固定的时间窗口内&#xff0c;可以允许固定数量的请求进入&#xff1b;超过数量就拒绝或者排队&#xff0c;等下一个时间段进入, 如下图 时间窗长度划分为1秒 单个时间窗的请求阈值为3 上述存在一个问题, 假如9:18:04:…

2024年C语言最新经典面试题汇总(11-20)

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…