当前位置: 首页 > news >正文

凡客网站建设/域名注册查询官网

凡客网站建设,域名注册查询官网,wordpress 所有分类,织梦自定义表单做网站在线留言C类和对象3 一、初始化列表二、类型转换三、static成员四、友元五、内部类六、匿名对象 以下代码环境在 VS2022。 一、初始化列表 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表&a…

C++类和对象3

  • 一、初始化列表
  • 二、类型转换
  • 三、static成员
  • 四、友元
  • 五、内部类
  • 六、匿名对象

以下代码环境在 VS2022

一、初始化列表

  1. 之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有⼀种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个 " 成员变量 " 后面跟一个放在括号中的初始值或表达式。

  2. 每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。

  3. 引用成员变量,const 成员变量,没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错

  4. C++11 支持在成员变量声明的位置给缺省值,这个缺省值主要是给没有显示在初始化列表初始化的成员使用的

  5. 尽量使用初始化列表初始化,因为那些不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++ 并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误

  6. 初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关,建议声明顺序和初始化列表顺序保持一致

#include <iostream>
using namespace std;class Time
{
public:Time(int a) : _time(a){cout << "time" << endl;}void print(){cout << _time << endl;}private:int _time;};class Date
{
public:Date(int& a, int year = 2000, int month = 1, int day = 1):_year(year),_month(month),_day(day),_hour(20),_a(a),_n(1){// 引用成员变量,const 成员变量,// 没有默认构造的类类型变量,// 必须放在初始化列表位置进行初始化,// 否则会编译报错}void print(){cout << _year << " " << _month << " " << _day << " ";_hour.print();cout << " " << _a << " " << _n;}private:int _year;int _month;int _day;Time _hour;int& _a;const int _n;};int main()
{int x = 10;Date d1(x);d1.print();return 0;
}
class Date
{
public://...private:// 注意这⾥不是初始化,这⾥给的是缺省值,// 这个缺省值是给初始化列表的,// 如果初始化列表没有显⽰初始化,// 默认就会⽤这个缺省值初始化int _year = 1000;int _month = 12;int _day = 12;Time _hour = 10;int& _a = _year;const int _n = 5;};

二、类型转换

  1. C++ 支持 内置 类型隐式转换为 类型对象,需要有相关内置类型为参数的构造函数。
  2. 构造函数前面加 explicit 就不再支持隐式类型转换
#include<iostream>
using namespace std;class A
{
public:// 构造函数explicit就不再⽀持隐式类型转换// explicit A(int a1)A(int a1):_a1(a1){;}//explicit A(int a1, int a2)A(int a1, int a2):_a1(a1), _a2(a2){;}void print(){cout << _a1 << " " << _a2 << endl;}private:int _a1 = 1;int _a2 = 2;};int main()
{// 1构造⼀个A的临时对象,再⽤这个临时对象拷⻉构造aa3// 编译器遇到连续构造+拷⻉构造->优化为直接构造A aa1 = 1;aa1.print();const A& aa2 = 1;// C++11之后才⽀持多参数转化A aa3 = { 2,2 };aa3.print();return 0;
}

三、static成员

  1. 用 static 修饰的成员变量,称之为静态成员变量,静态成员变量不加 const 一定要在类外进行初始化

  2. 静态成员变量为所有类对象所共享,不属于某个具体的对象,不存在对象中,存放在静态区

  3. 用 static 修饰的成员函数,称之为静态成员函数,静态成员函数没有 this 指针

  4. 静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有 this 指针。

  5. 非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。

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

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

  8. 静态成员变量在不加 const 不能在声明位置给缺省值初始化。缺省值是用于构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表

// 实现⼀个类,计算程序中创建出了多少个类对象?
#include<iostream>
using namespace std;class A
{
public:A(){++_scount;}A(const A& t){++_scount;}~A(){--_scount;}static int GetACount(){return _scount;}private:// 类⾥⾯声明static int _scount;
};
// 类外⾯初始化
int A::_scount = 0;int main()
{cout << A::GetACount() << endl;A a1, a2;A a3(a1);cout << A::GetACount() << endl;cout << a1.GetACount() << endl;// 编译报错,⽆法访问 private 成员//cout << A::_scount << endl;return 0;
}

四、友元

  1. 友元提供了一种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类声明的前面加 friend,并且把友元声明放到一个类的里面。

  2. 外部友元函数可访问类的私有和保护成员,友元函数仅仅是一种声明,他不是类的成员函数。

  3. 友元函数可以在类定义的任何地方声明,不受类访问限定符限制。

  4. 一个函数可以是多个类的友元函数。

  5. 友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。

  6. 友元类的关系是单向的,不具有交换性,比如 A 类是 B 类的友元,但是 B 类不是 A 类的友元

  7. 友元类关系不能传递,如果 A 是 B 的友元,B 是 C 的友元,但是 A 不是 B 的友元

  8. 有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用

#include<iostream>
using namespace std;// 前置声明,都则A的友元函数声明编译器不认识B
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;
}
#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.func1(aa);return 0;
}

五、内部类

  1. 如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。

  2. 内部类默认是外部类的友元类

  3. 内部类本质也是一种封装,当 A 类跟 B 类紧密关联,A 类实现出来主要就是给 B 类使用,那么可以考虑把 A 类设计为 B 的内部类,如果放到 private / protected 位置,那么 A 类就是 B 类的专属内部类,其他地方都用不了。

#include<iostream>
using namespace std;class A
{
private:static int _k;int _h = 1;public:class B		// B默认就是A的友元{public:void foo(const A& a){cout << _k << endl;			cout << a._h << endl;		}};
};int A::_k = 1;int main()
{cout << sizeof(A) << endl;A::B b;A aa;b.foo(aa);return 0;
}

六、匿名对象

  1. 用 “ 类型(实参) ” 定义出来的对象叫做匿名对象,相比之前我们定义的 “ 类型 对象名(实参) ” 定义出来的叫有名对象。

  2. 匿名对象生命周期只在当前一行,一般临时定义一个对象当前用一下即可,就可以定义匿名对象

#include <iostream>
using namespace std;class A
{
public:A(int a = 0):_a(a){cout << "A(int a)" << endl;}~A(){cout << "~A()" << endl;}private:int _a;};class Solution {public:int Sum_Solution(int n) {//...return n;}
};
int main()
{A aa1; // 不能这么定义对象,因为编译器⽆法识别下⾯是⼀个函数声明,还是对象定义//A aa1();// 但是我们可以这么定义匿名对象,匿名对象的特点不⽤取名字,// 但是他的⽣命周期只有这⼀⾏,我们可以看到下⼀⾏他就会⾃动调⽤析构函数A();A(1);A aa2(2);// 匿名对象在这样场景下就很好⽤Solution().Sum_Solution(10);return 0;
}

相关文章:

(学习总结12)C++类和对象3

C类和对象3 一、初始化列表二、类型转换三、static成员四、友元五、内部类六、匿名对象 以下代码环境在 VS2022。 一、初始化列表 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有⼀种方式&#xff0c;就是初始化列表&a…...

docxtpl,一个强大的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - docxtpl。 项目地址&#xff1a;https://docxtpl.readthedocs.io/en/latest/ 在日常工作中&#xff0c;自动生成和处理 Word 文档是一个常见需求。doc…...

捷途山海T2:超长续航,节能环保的驾驶新星

在当今的汽车市场中&#xff0c;消费者的购车选择日趋多样化&#xff0c;不再仅限于传统的燃油车。随着环保理念的深入人心以及人们对用车成本的日益关注&#xff0c;像捷途山海T2这样配备高效混动系统的车型逐渐受到大众的青睐。 捷途山海T2&#xff0c;以其杰出的节能性、强劲…...

[Day 45] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的可擴展性挑戰 概述 區塊鏈技術在過去幾年中取得了顯著的進展&#xff0c;其去中心化、透明和安全的特性使其在金融、供應鏈管理、醫療等領域得到了廣泛應用。然而&#xff0c;區塊鏈技術的一個重大挑戰是其可擴展性。可擴展性是指系統能夠有效處理日益增長的數據和用…...

白骑士的PyCharm教学实战项目篇 4.3 自动化测试与持续集成

系列目录 上一篇&#xff1a; 在现代软件开发过程中&#xff0c;自动化测试与持续集成&#xff08;CI&#xff09;是确保代码质量和快速交付的关键环节。PyCharm作为一款强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;为自动化测试和持续集成提供了全面的支持。本…...

权限模块开发+权限与角色关联(完整CRUD)

文章目录 &#x1f31e; Sun Frame&#xff1a;SpringBoot 的轻量级开发框架&#xff08;个人开源项目推荐&#xff09;&#x1f31f; 亮点功能&#x1f4e6; spring cloud模块概览常用工具 &#x1f517; 更多信息1.easycode生成代码1.配置2.AuthPermissionDao.java剪切到mapp…...

llama神经网络的结构,llama-3-8b.layers=32 llama-3-70b.layers=80; 2000汉字举例说明

目录 llama-3-8b.layers=32 llama-3-70b.layers=80 llama神经网络的结构 Llama神经网络结构示例 示例中的输入输出大小 实际举例说明2000个汉字文本数据集 初始化词嵌入矩阵 1. 输入层 2. 嵌入层 3. 卷积层 4. 全连接层 llama-3-8b.layers=32 llama-3-70b.laye…...

单细胞数据怎么表现genes mRNA表达的热图?

愿武艺晴小朋友一定得每天都开心 #热图 library("ComplexHeatmap") exp <- AverageExpression(subset(fasting_memory, Celltype %in% c("Pre-B")), layer = "data", #即CPM值 features …...

Java聚合快递对接云洋系统小程序源码

&#x1f680;【物流新纪元】聚合快递如何无缝对接云洋系统&#xff0c;效率飙升秘籍大公开&#xff01;✨ &#x1f50d; 开篇揭秘&#xff1a;聚合快递的魅力所在 Hey小伙伴们&#xff0c;你是否还在为多家快递公司账号管理繁琐、订单处理效率低下而头疼&#xff1f;&#…...

MySQL——数据表的基本操作(三)修改数据表

有时候&#xff0c;希望对表中的某些信息进行修改&#xff0c;这时就需要修改数据表。所谓修改数据表指的是修改数据库中已经存在的数据表结构&#xff0c;比如&#xff0c;修改表名、修改字段名、修改字段的数据类型等。在 MySQL中&#xff0c;修改数据表的操作都是使用 ALTER…...

医学图像分割的基准:TransUnet(用于医学图像分割的Transformer编码器)器官分割

1、 TransUnet 介绍 TransUnet是一种用于医学图像分割的深度学习模型。它是基于Transformer模型的图像分割方法&#xff0c;由AI研究公司Hugging Face在2021年提出。 医学图像分割是一项重要的任务&#xff0c;旨在将医学图像中的不同结构和区域分离出来&#xff0c;以便医生可…...

java-swing编写学生成绩查询管理系统

本文是本人大二上实训项目-学生成绩查询管理系统&#xff0c;采用本项目使用Java、MySQL技术。界面框架由Java Swing搭建&#xff0c;用JDBC实现Java与MySQL的连接。 本项目适合初学java和mysql的同学&#xff0c;来做一些小项目来提升自己&#xff0c;因为兴趣所以想要做去尝…...

volatile浅解

volatile修饰的变量有两个特点 线程中修改了自己工作内存中的副本后&#xff0c;立即将其刷新到主内存工作内存中每次读取共享变量时&#xff0c;都会去主内存中重新读取&#xff0c;然后拷贝到工作内存 内存 -> CPU Cache -> CPU 如果没有volatile那么就会继续读取缓存…...

世媒讯带您了解什么是媒体邀约

什么是媒体邀约&#xff1f;其实媒体邀约是一种公关策略&#xff0c;旨在通过邀请媒体记者和编辑参加特定的活动、发布会或其他重要事件&#xff0c;以确保这些活动能够得到广泛的报道和关注。通过这种方式&#xff0c;企业和组织希望能够传达重要信息&#xff0c;提高品牌知名…...

[Kimi 笔记]“面向搜索引擎”

"面向搜索引擎"&#xff08;Search Engine-Oriented&#xff0c;SEO-Oriented 或 SEO-Friendly&#xff09;通常指的是在设计和开发网站时&#xff0c;采取一系列措施来优化网站内容和结构&#xff0c;以便提高网站在搜索引擎结果页面&#xff08;SERP&#xff09;中…...

如何在亚马逊云科技AWS上利用LoRA高效微调AI大模型减少预测偏差

简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 在机器学习和人工智能领域&#xff0c;生成偏差…...

订单定时状态处理业务(SpringTask)

文章目录 概要整体架构流程技术细节小结 概要 订单定时状态处理通常涉及到对订单状态进行定期检查&#xff0c;并根据订单的状态自动执行某些操作&#xff0c;比如关闭未支付的订单、自动确认收货等. 需求分析以及接口设计 需求分析 用户下单后可能存在的情况&#xff1a; …...

STM32 | ADC+RS485(第十天)

点击上方"蓝字"关注我们 01、ADC概述 ADC, Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器。是指将连续变量的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号.例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的…...

python打包成能够在mac里面运行的程序

要将你的PyQt5应用程序打包成可以在macOS上运行的独立应用程序&#xff0c;可以使用工具如PyInstaller或py2app。下面是使用py2app的详细步骤&#xff0c;因为它是macOS上专用的打包工具&#xff0c;并且更好地支持PyQt5。 1. 安装py2app 首先&#xff0c;确保你的macOS系统上…...

基于FPGA的数字信号处理(20)--半减器和全减器

目录 1、前言 2、半减器 3、全减器 4、减法器 文章总目录点这里&#xff1a;《基于FPGA的数字信号处理》专栏的导航与说明 1、前言 既然有半加器和全加器&#xff0c;那自然也有半减器和全减器了。尽管在电路中减法的实现基本都是 补码 加法 的形式&#xff0c;但是正所谓…...

Python:单引号,双引号,三引号的区别

在Python中&#xff0c;单引号&#xff08;&#xff09;、双引号&#xff08;"&#xff09;和三引号&#xff08; 或 """&#xff09;都可以用来定义字符串&#xff0c;但它们之间有一些区别&#xff1a; 单引号&#xff08;&#xff09;和双引号&#xf…...

电子电气架构 ---SOMEIP/SD初入门

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…...

一些数学基础概念

一些数学基础概念 概率密度函数(PDF) 概率密度函数&#xff08;Probability Density Function&#xff0c;简称 PDF&#xff09;是描述连续随机变量的概率分布的一种函数。它用来表示随机变量在各个取值区间内的概率密度。 1. 定义 对于一个连续随机变量 ( X )&#xff0c;…...

责任有限公司的一般组织结构

责任有限公司&#xff08;有限责任公司&#xff0c;LLC&#xff09;的组织结构通常是为了确保公司运营的有效性和管理的透明度。以下是一般责任有限公司的组织结构及其主要组成部分&#xff1a; 1. 股东&#xff08;Shareholders&#xff09; 职责和角色 所有者&#xff1a;…...

Leetcode3227. 字符串元音游戏

Every day a Leetcode 题目来源&#xff1a;3227. 字符串元音游戏 解法1&#xff1a;博弈论 分类讨论&#xff1a; 如果 s 不包含任何元音&#xff0c;小红输。如果 s 包含奇数个元音&#xff0c;小红可以直接把整个 s 移除&#xff0c;小红赢。如果 s 包含正偶数个元音&am…...

网络流量分析在运维管理中的重要性与实施策略

在运维管理工作中&#xff0c;网络流量分析是一项不可或缺的技术手段。通过对网络流量的深入剖析&#xff0c;运维团队能够更全面地了解网络状态&#xff0c;及时发现潜在问题&#xff0c;优化网络性能&#xff0c;从而确保企业网络的稳定与高效运行。本文将详细探讨网络流量分…...

通信原理实验——PCM编译码

PCM编译码 实验目的 理解PCM编译码原理及PCM编译码性能熟悉PCM编译码专用集成芯片的功能和使用方法及各种时钟关系熟悉语音数字化技术的主要指标及测量方法 主要仪器设备及软件 硬件&#xff1a;多功能实验箱、示波器、导线 软件&#xff1a;无 实验原理 1. 抽样信号的量…...

matlab的strel()函数的使用方法(OK)

这个函数 是形态学的结构元素 使用方法如下 SE strel(nhood) SE strel("diamond",r) SE strel("disk",r) SE strel("disk",r,n) SE strel("octagon",r) SE strel("line",len,deg) SE strel("rectangle",…...

Linux:Linux权限解析

一、Linux下的用户分类 在Linux下&#xff0c;有两种用户&#xff0c;一种是超级用户&#xff0c;一种是普通用户 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受权限限制&#xff08;制定规则&#xff0c;但不需要遵守规则&#xff09; 普通用户&#xff1…...

Spring面试篇章——IOC

IOC概念和原理 IOC概念 IOC就是控制反射&#xff0c;把对象创建和对象之间的调用过程&#xff0c;交给Spring进行管理使用IOC的目的&#xff1a;降低耦合度 IOC底层原理 xml解析、工厂模式、反射 图解&#xff1a; 原始模式 耦合度太高了&#xff0c;即当dao改了&#xf…...