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

news2025/2/1 20:23:26

目录

  • 一、构造函数补充
    • 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.coloradmin.cn/o/2289445.html

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

相关文章

FPGA|使用quartus II通过AS下载POF固件

1、将开发板设置到AS下载挡位&#xff0c;或者把下载线插入到AS端口 2、打开quartus II&#xff0c;选择Tools→Programmer→ Mode选择Active Serial Programming 3、点击左侧Add file…&#xff0c;选择 .pof 文件 →start 4、勾选program和verify&#xff08;可选&#xff0…

27.Word:财务软件应用的书稿【10】

目录 NO1.2 NO3 NO5.6​ NO7.8​ NO9​ 存在页码链接关系&#xff0c;只是页码格式不同 NO1.2 另存为/F12&#xff1a;考生文件夹布局→页面设置对话框→页边距&#xff1a;上下内外/装订线→纸张大小→布局&#xff1a;页眉页脚 NO3 样式的应用&#xff1a;超快速❗ 开…

AI编程:如何编写提示词

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

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机&#xff08;基于 STM32CubeIDE GCC 开发&#xff09;&#xff0c;它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的&#xff0c;缺点是不支持…

DeepSeek本地版安装简易教程(windows)

第一步&#xff1a;下载 第二步&#xff1a;安装 先安装ollama&#xff0c;安装完毕保持ollama运行&#xff0c;设置ollama通过防火墙&#xff0c;再安装deepseek&#xff0c;7b代表下载的r1版本&#xff0c;版本越高消耗资源越大 第三步&#xff1a;开放windows防火墙 第四步…

RK3568使用QT搭建TCP服务器和客户端

文章目录 一、让RK3568开发板先连接上wifi二、客户端代码1. `widget.h` 文件2. `widget.cpp` 文件**详细讲解**1. **`Widget` 类构造函数 (`Widget::Widget`)**2. **UI 布局 (`setupUI`)**3. **连接按钮的槽函数 (`onConnectClicked`)**4. **发送消息按钮的槽函数 (`onSendMess…

Python爬虫之——Cookie存储器

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码总结 专栏导读 &#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;请点击——> 一晌小贪欢的博客主页求关注 &…

蓝桥杯刷题DAY1:前缀和

所谓刷题&#xff0c;讲究的就是细心 帕鲁服务器崩坏【算法赛】 “那个帕鲁我已经观察你很久了&#xff0c;我对你是有些失望的&#xff0c;进了这个营地&#xff0c;不是把事情做好就可以的&#xff0c;你需要有体系化思考的能力。” 《幻兽帕鲁》火遍全网&#xff0c;成为…

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口&#xff0c;该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…

OpenCV:SIFT关键点检测与描述子计算

目录 1. 什么是 SIFT&#xff1f; 2. SIFT 的核心步骤 2.1 尺度空间构建 2.2 关键点检测与精细化 2.3 方向分配 2.4 计算特征描述子 3. OpenCV SIFT API 介绍 3.1 cv2.SIFT_create() 3.2 sift.detect() 3.3 sift.compute() 3.4 sift.detectAndCompute() 4. SIFT 关…

爬虫基础(一)HTTP协议 :请求与响应

前言 爬虫需要基础知识&#xff0c;HTTP协议只是个开始&#xff0c;除此之外还有很多&#xff0c;我们慢慢来记录。 今天的HTTP协议&#xff0c;会有助于我们更好的了解网络。 一、什么是HTTP协议 &#xff08;1&#xff09;定义 HTTP&#xff08;超文本传输协议&#xff…

【4Day创客实践入门教程】Day1 工具箱构建——开发环境的构建

Day1 工具箱构建——开发环境的构建 目录 Day1 工具箱构建——开发环境的构建1.元件选型2.准备工具3. 开发板准备焊接排针具体步骤注意事项与技巧 4. 软件环境配置与固件烧录Thonny IDE软件环境配置配置Micropython环境与烧录固件**问题&#xff1a;**买的是4M/16M&#xff0c;…

如何让一个用户具备创建审批流程的权限

最近碰到一个问题&#xff0c;两个sandbox&#xff0c;照理用户的权限应该是一样的&#xff0c;结果开发环境里面我可以左右的做各种管理工作&#xff0c;但是使用change set上传后&#xff0c;另一个环境的同一个用户&#xff0c;没有相对于的权限&#xff0c;权限不足。 当时…

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型&#xff0c;它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本&#xff0c;还可以处理图像等其他模态的信息。 模型主要特点:Permalink…

【详细教程】如何在Mac部署Deepseek R1?

DeepSeek是目前最火的国产大模型&#xff0c;官方App用户太多服务经常出现卡顿&#xff0c;部署一个本地DeepSeek R1可以方便使用。 1.系统最低要求 macOS 11 Big Sur 或更新 2.下载ollama https://ollama.com/ 3.安装DeepSeek R1 打开终端 运行命令 ollama run deepseek-…

DeepSeek能下围棋吗?(续)

休息了一下&#xff0c;接着琢磨围棋&#xff0c;其实前面一篇里的规则有个漏洞的&#xff0c;就是邻居关系定义有问题&#xff0c;先回顾一下游戏规则&#xff1a; 游戏规则 定义&#xff1a; 1.数字对&#xff0c;是指两个1到9之间的整数组成的有序集合。可与记为(m,n)&…

【产品经理学习案例——AI翻译棒出海业务】

前言&#xff1a; 本文主要讲述了硬件产品在出海过程中&#xff0c;翻译质量、翻译速度和本地化落地策略是硬件产品规划需要考虑的核心因素。针对不同国家&#xff0c;需要优化翻译质量和算法&#xff0c;关注市场需求和文化差异&#xff0c;以便更好地满足当地用户的需求。同…

被裁与人生的意义--春节随想

还有两个月就要被迫离开工作了十多年的公司了&#xff0c;不过有幸安安稳稳的过了一个春节&#xff0c;很知足! 我是最后一批要离开的&#xff0c;一百多号同事都没“活到”蛇年。看着一批批仁人志士被“秋后斩首”&#xff0c;马上轮到我们十来个&#xff0c;个中滋味很难言清…

4-图像梯度计算

文章目录 4.图像梯度计算(1)Sobel算子(2)梯度计算方法(3)Scharr与Laplacian算子4.图像梯度计算 (1)Sobel算子 图像梯度-Sobel算子 Sobel算子是一种经典的图像边缘检测算子,广泛应用于图像处理和计算机视觉领域。以下是关于Sobel算子的详细介绍: 基本原理 Sobel算子…

【算法设计与分析】实验5:贪心算法—装载及背包问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握贪心算法求解问题的思想&#xff1b;针对不同问题&#xff0c;会利用贪心算法进行问题建模、求解以及时间复杂度分析&#x…