【C++】类和对象(5)

目录

  • 一、构造函数补充
    • 1、初始化列表
  • 二、类型转换
  • 三、static成员
  • 四、友元
    • 1、友元函数
    • 2、友元类
  • 五、内部类
  • 六、匿名对象

一、构造函数补充

对于之前讲解的构造函数,还有一些更深层次的内容要进行补充,接下来进行补充内容的讲解。

1、初始化列表

在我们学习构造函数的时候想要去初始化成员变量主要是使用函数体内赋值,接下来我们要介绍另一种构造函数方式:初始化列表
首先我们来看一段代码:

 class Date{public:Date(int& x,int year = 1,int month = 1, int day = 1):_year(year),_month(month),_day(day){}

上面的代码展示了初始化列表的具体写法,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每一个“成员变量”后面跟一个放在括号中的初始值或表达式,可以写成一行也可以写成多行。
对于初始化列表,我们有几点需要注意
1、每个成员变量在初始化列表中只能出现一次,我们可以认为初始化列表就是每个成员变量定义初始化的地方。
2、引⽤成员变量,const成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进⾏初始化,否则会编译报错。

 #include<iostream>using namespace std;class Time
{
public:Time(int hour):_hour(hour){cout << "Time()" << endl;}
private:int _hour;
};class Date
{
public:Date(int& x,int year = 1,int month = 1, int day = 1):_year(year),_month(month),_day(day),_t(12),_re(x),_n(1){}void Print() const{cout << _year << "-" << _month << "-"  << _day << endl;}
private:int _year;int _month;int _day;Time _t;int& _re;const int _n;
};
int main()
{int i = 0;Date d1(i);d1.Print();return 0;
} 

注意:
引⽤成员变量,const成员变量,没有默认构造的类类型变量(上面的代码中展现了),必须放在初始化列表位置进⾏初始化,否则会编译报错。
在这里插入图片描述
同时初始化列表和之前我们学的函数体内赋值也可以混着用。
C++11⽀持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤。
在这里插入图片描述
当我们不给缺省值时,对于没有显式在初始化列表初始化的内置类型成员是否初始化取决于编译器
对于没有显式在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会报错。

C++规定:
⽆论是否显⽰写初始化列表,每个构造函数都有初始化列表,那些不在初始化列表初始化的成员变量也会走初始化列表,所以我们尽量写初始化列表

二、类型转换

C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数。

 #include<iostream>using namespace std;class A{public:A(int a1):_a1(a1){}A(int a1, int a2):_a1(a1),_a2(a2){}void Print(){cout << _a1 << " " << _a2 << endl;}int Get() const{return _a1 + _a2;}
private:int _a1 = 1;int _a2 = 2;
};
class B
{
public:B(const A& a):_b(a,Get()){}
public:int _b = 0;
};
int main()
{A aa1 = 1;aa1.Print();const A& aa2 = 1;A aa3 = {2,2 };B b = aa3;const B& rb = aa3;return 0;} 

在这里插入图片描述
隐式类型转换生成的是临时对象,临时对象具有常性,所以要加上const引用
注意:
1、构造函数前面加explicit就不再支持隐式类型转换。
2、类类型的对象之间也可以隐式转换,需要相应的构造函数支持。

三、static成员

C++中的静态成员分为静态成员变量和静态成员函数,它们属于类本身而非类的实例,所有对象共享这些成员。
用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。用static修饰的成员函数,称之为静态成员函数,静态成员函数没有this指针。

注意:
1、初始化

class MyClass {
public:static int count; // 声明
};
int MyClass::count = 0; // 类外初始化

突破类域就可以访问静态成员,可以通过类名::静态成员 或者 对象.静态成员 来访问静态成员变量和静态成员函数。

2、静态成员也是类的成员,受public、protected、private 访问限定符的限制。

 class Secret {
private:static int key;
public:static int getKey() {return key;}
};
int Secret::key = 12345;

四、友元

在 C++ 中,友元(Friend) 是一种特殊的机制,允许一个类或函数访问另一个类的 私有(private) 和 保护(protected) 成员。友元打破了类的封装性,但为某些特殊场景提供了灵活性。

友元的分类:
友元分为:友元函数和友元类
友元的声明:
在函数声明或者类声明的前⾯加friend,并且把友元声明放到⼀个类的⾥⾯。

1、友元函数

作用:外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。

 #include<iostream>using namespace std;class B;class A{//友元声明friend void func(const A& aa, const B& bb);private:int _a1 = 1;int _a2 = 2;};class B{//友元声明friend void func(const A& aa, const B& bb);private:int _b1 = 3;int _b2 = 4;};void func(const A& aa, const B& bb){cout << aa._a1 << endl;cout << bb._b1 << endl;}int main(){A aa;B bb;func(aa, bb);return 0
}

例如在上面的代码中,func函数前面加了friend,那么这里func就是A的友元,func就可以访问A的成员。

注意:
1、友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制。
2、⼀个函数可以是多个类的友元函数。

2、友元类

#include<iostream>
using namespace std;
class A
{friend class B;
private:int _a1 = 1;int _a2 = 2;
};
class B
{ 
public:
void func1(const A& aa)
{
cout << aa._a1 << endl;
cout << _b1 << endl;
} 
void func2(const A& aa)
{cout << aa._a2 << endl;cout << _b2 << endl;}
private:int _b1 = 3;int _b2 = 4;
}int main()
{
A aa;
B bb;
bb.func1(aa);
bb.func2(aa);
return 0;
}

注意:
1、友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。
2、友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元。
3、友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。

五、内部类

如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相⽐,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类,内部类默认是外部类的友元类,内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地⽅都⽤不了。

六、匿名对象

⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象。
在这里插入图片描述
匿名对象⽣命周期只在当前⼀⾏,⼀般临时定义⼀个对象当前⽤⼀下即可,就可以定义匿名对象。

到这里类和对象的学习就算结束啦,大家多多支持哦!

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

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

相关文章

反向代理模块b

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

Python - Quantstats量化投资策略绩效统计包 - 详解

使用Quantstats包做量化投资绩效统计的时候因为Pandas、Quantstats版本不匹配踩了一些坑&#xff1b;另外&#xff0c;Quantstats中的绩效统计指标非常全面&#xff0c;因此详细记录一下BUG修复方法、使用说明以及部分指标的内涵示意。 一、Quantstats安装及版本匹配问题 可以…

C#,入门教程(13)——字符(char)及字符串(string)的基础知识

上一篇&#xff1a; C#&#xff0c;入门教程(12)——数组及数组使用的基础知识https://blog.csdn.net/beijinghorn/article/details/123918227 字符串的使用与操作是必需掌握得滚瓜烂熟的编程技能之一&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; C#语言实…

主流的AEB标准有哪些?

目录 1、AEB的技术构成与工作原理 2、典型应用场景举例 3、AEB的功能分类 4、AEB系统性能评估的关键因素 5、全球AEB技术标准概览 5.1、联合国欧洲经济委员会&#xff08;UN ECE&#xff09; 5.2、美国NHTSA法规 5.3、中国标准 5.4、印度AIS 185 5.5、澳大利亚ADR法规…

Linux网络 | 网络层IP报文解析、认识网段划分与IP地址

前言&#xff1a;本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外&#xff0c; 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说&#xff0c; 开始我们的学习吧&#xff01;&#xff01; ps&#xff1a;本节正式进入网络层喽&#xff0c; 友友们…

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)

一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…

TCL C++开发面试题及参考答案

进程和线程的区别 进程和线程都是操作系统中重要的概念,它们在很多方面存在着明显的区别。 从概念上来说,进程是资源分配的基本单位,每个进程都有自己独立的地址空间、内存、文件描述符等资源。例如,当我们在计算机上同时运行多个应用程序,像浏览器、文本编辑器等,每个应…

如何获取当前的位置信息

文章目录 1 概念介绍2 使用方法3 示例代码3 体验分享 我们在上一章回中介绍了如何实现滑动菜单相关的内容&#xff0c;本章回中将介绍如何获取位置信息.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的获取位置信息本质上是获取当前手机所在位置的…

python-leetcode-旋转链表

61. 旋转链表 - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def rotateRight(self, head: Optional[ListN…

基于排队理论的物联网发布/订阅通信系统建模与优化

论文标题 英文标题&#xff1a;Queuing Theory-Based Modeling and Optimization of a Publish/Subscribe IoT Communication System 中文标题&#xff1a;基于排队理论的物联网发布/订阅通信系统建模与优化 作者信息 Franc Pouhela Anthony Kiggundu Hans D. Schotten …

[EAI-026] DeepSeek-VL2 技术报告解读

Paper Card 论文标题&#xff1a;DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding 论文作者&#xff1a;Zhiyu Wu, Xiaokang Chen, Zizheng Pan, Xingchao Liu, Wen Liu, Damai Dai, Huazuo Gao, Yiyang Ma, Chengyue Wu, Bin…

基于Python的药物相互作用预测模型AI构建与优化(下.代码部分)

四、特征工程 4.1 分子描述符计算 分子描述符作为量化分子性质的关键数值,能够从多维度反映药物分子的结构和化学特征,在药物相互作用预测中起着举足轻重的作用。RDKit 库凭借其强大的功能,为我们提供了丰富的分子描述符计算方法,涵盖了多个重要方面的分子性质。 分子量…

【算法】动态规划专题① ——线性DP python

目录 引入简单实现稍加变形举一反三实战演练总结 引入 楼梯有个台阶&#xff0c;每次可以一步上1阶或2阶。一共有多少种不同的上楼方法&#xff1f; 怎么去思考&#xff1f; 假设就只有1个台阶&#xff0c;走法只有&#xff1a;1 只有2台阶&#xff1a; 11&#xff0c;2 只有3台…

0 基础学运维:解锁 K8s 云计算运维工程师成长密码

前言&#xff1a;作为一个过来人&#xff0c;我曾站在技术的门槛之外&#xff0c;连电脑运行内存和内存空间都傻傻分不清&#xff0c;完完全全的零基础。但如今&#xff0c;我已成长为一名资深的k8s云计算运维工程师。回顾这段历程&#xff0c;我深知踏上这条技术之路的艰辛与不…

事务03之MVCC机制

MVCC 多版本并发控制机制 文章目录 MVCC 多版本并发控制机制一&#xff1a;并发事务的场景1&#xff1a;读读场景2&#xff1a;写写场景3&#xff1a;读写 or 写读场景 二&#xff1a;MVCC机制综述1&#xff1a;MVCC日常生活的体现2&#xff1a;多版本并发控制 三&#xff1a;M…

数据结构-Stack和栈

1.栈 1.1什么是栈 栈是一种特殊的线性表&#xff0c;只允许在固定的一段进行插入和删除操作&#xff0c;进行插入和删除操作的一段称为栈顶&#xff0c;另一端称为栈底。 栈中的数据元素遵顼后进先出LIFO&#xff08;Last In First Out&#xff09;的原则&#xff0c;就像一…

langchain基础(二)

一、输出解析器&#xff08;Output Parser&#xff09; 作用&#xff1a;&#xff08;1&#xff09;让模型按照指定的格式输出&#xff1b; &#xff08;2&#xff09;解析模型输出&#xff0c;提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser&#xff1a;…

AI编程:如何编写提示词

这是小卷对AI编程工具学习的第2篇文章&#xff0c;今天讲讲如何编写AI编程的提示词&#xff0c;并结合实际功能需求案例来进行开发 1.编写提示词的技巧 好的提示词应该是&#xff1a;目标清晰明确&#xff0c;具有针对性&#xff0c;能引导模型理解问题 下面是两条提示词的对…

【B站保姆级视频教程:Jetson配置YOLOv11环境(五)Miniconda安装与配置】

B站同步视频教程&#xff1a;https://www.bilibili.com/video/BV1MwFDeyEYC/ 文章目录 0. Anaconda vs Miniconda in Jetson1. 下载Miniconda32. 安装Miniconda33. 换源3.1 conda 换源3.2 pip 换源 4. 创建环境5. 设置默认启动环境 0. Anaconda vs Miniconda in Jetson Jetson…

仿真设计|基于51单片机的无线投票系统仿真

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;投票系统分为发送端和接收端。 &#xff08;2&#xff09;发送端通过按…