c++类和对象(下篇)下

news2025/4/17 1:11:13

        下面就来补充一下c++雷和对象最后一点内容.

        首先先补充一下上一篇博客上c++类和对象(下篇)上-CSDN博客最后学习的静态成员变量的小练习求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com)下面就是题解.灵活的运用了静态成员变量不销毁的特点,建立数组利用构造函数来完成n次相加.

class A{
public:
    A()
    {
        _sum+=_a;
        ++_a;
    }
    static int Getsum()
    {
        return _sum;
    }
private:
    static int _a;
    static int _sum;
};
int A::_a=1;
int A::_sum=0;
class Solution {
public:
    int Sum_Solution(int n) {
        A arr[n];
        return arr[0].Getsum();

    }
};

        下面我们开始今天的学习.

友元

        其实在日期类中重载<<,>>操作符是已经使用过友元函数了.下面就让我们好好的了解一下友元.

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

        友元函数:外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数.友元函数可以在类定义的任何地⽅声明,不受类访问限定符限制.只是声明.且⼀个函数可以是多个类的友元函数.

        友元类:如果A是B的友元类,那么A可以访问B中的私有和保护成员.友元类的关系是单向的,不具有交换性,⽐如A类是B类的友元,但是B类不是A类的友元.友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元.(互为友元要声明和定义分离,不然会有定义在上面的那个找不到下面的成员的问题)

        虽然友元可以提供便利,但是友元破坏了封装,所以友元尽量不要多用.

        一点点相关练习(注释是我的易错点)

//要先声明,不然A不认识B
class B;

class A
{
	friend void Func(A& a, B& b);
public:
	A(int a1,int a2)
	{
		_a1 = a1;
		_a2 = a2;
	}
private:
	int _a1 = 0;
	int _a2 = 0;
};

class B
{
	friend void Func(A& a, B& b);
public:
	B(int b1)
	{
		_b1 = b1;
	}
private:
	int _b1 = 0;
};

void Func(A& a, B& b)
{
	cout << a._a1 << " " << a._a2 << endl;
	cout << b._b1<< endl;
}
int main()
{
	A a= { 5,6 };
	B b = 2;
	Func(a, b);
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using namespace std;

class A
{
	friend void Func(A& a);
public:
	A(int a1, int a2)
		:_a1(a1)
		,_a2(a2)
	{

	}
private:
	int _a1 = 0;
	int _a2 = 1;
};

void Func(A&a)
{
	cout << a._a1 << " " << a._a2 << endl;
}
int main()
{
	A a= { 5,6 };
	Func(a);
	return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>

using namespace std;

class Time
{
	friend class Date;
public:
	Time(int hour=8)
		:_hour(hour)
	{

	}
private:
	int _hour;
};

class Date
{
public:
	Date(int year = 2025, int month = 3, int day = 19)
		:_year(year)
		, _month(month)
		, _day(day)
		//,_hour(hour)
	{
		
	}
	void Func(Time& t)
	{
		cout << t._hour<<endl;
		cout << Time()._hour << endl;
		//cout<<_hour<<endl
		// 会有为识别_hour的报错
		//_hour不可以在友元类中直接使用,要先创建出自己类的对象在使用,或用匿名对象来使用才可以
		//也不可以直接在构造函数中直接用初始化列表来初始化_hour
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Time t;
	Date d;
	d.Func(t);
	return 0;
}

内部类

        如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类.内部类是⼀个独立的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类.(用sizeof计算时只算自己的类的大小).且内部类默认是外部类的友元类.(内部类可以访问外部类的成员变量但是外部类却不能访问内部类的成员函数).

        内部类本质也是⼀种封装,当A类实现出来主要就是给B类使用,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了.(主意和友元做区分,友元不受访问限定符的限制.)


class A
{
public:
	class B
	{
	public:
		void Fuc(const A&a)
		{
			cout << a.a1 << " " << a2 << endl;
		}
	private:
		int b = 0;
	};
private:
	int a1 = 0;
	static int a2;
};

int main()
{
	cout << sizeof(A) << endl;
	A a;
	//B b;
	//没有突破类域所以没办法找到B这个类
	A::B b;
	b.Fuc(a);
	return 0;
}
class A
{
public:

private:
	int a1 = 0;
	static int a2;
	class B
	{
	public:
		void Fuc(const A& a)
		{
			cout << a.a1 << " " << a2 << endl;
		}
	private:
		int b = 0;
	};
};

int main()
{
	cout << sizeof(A) << endl;
	A a;
	//B b;
	//没有突破类域所以没办法找到B这个类
	//A::B b;
	//b.Fuc(a);
	//定义为private后就不能在类外访问了
	return 0;
}

匿名对象

       类型(实参) 定义出来的对象叫做匿名对象,而之前我们定义的 类型 对象名(实参) 定义出来的叫有名对象.匿名对象⽣命周期只在当前一行,即用即销毁.(在向链表/顺序表中插入数据时很好用).

        一点点相关代码

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};
int main()
{
	A(1);

	return 0;
}

对象拷贝时的编译器优化(了解)

        现代编译器会为了尽可能提⾼程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返 回值的过程中可以省略的拷⻉,但是在c++标准中却没有定义如何优化.一般看编译器,下面简单的了解下几种适中的编译器优化.(通常会比下面说的更优化)

        1.传值传参下同一行中连续的构造+拷贝构造->直接构造

        2.传值返回,连续构造+拷贝构造->直接构造

                        ​    

        以上就是我所学习的类和对象的全部内荣啦,类和对象暂时告一段落了.大家晚安

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

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

相关文章

使用WebDAV将文件传输到实时(RT)目标 转发

如何配置Web分布式创作和版本控制&#xff08;WebDAV&#xff09;服务器并使用它来与我的实时(RT)目标之间传输文件&#xff1f; 在目标上安装 WebDAV 和 SSL 支持 NI Linux Real-Time 您无需完成任何安装 WebDAV 和 SSL 支持的步骤。默认情况下&#xff0c;这些组件在NI Linu…

Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取

Web爬虫利器FireCrawl&#xff1a;全方位助力AI训练与高效数据抓取 一、FireCrawl 项目简介二、主要功能三、FireCrawl应用场景1. 大语言模型训练2. 检索增强生成&#xff08;RAG&#xff09;&#xff1a;3. 数据驱动的开发项目4. SEO 与内容优化5. 在线服务与工具集成 四、安装…

如何避免PRD(需求文档)成为“沟通黑洞”

在撰写PRD&#xff08;需求文档&#xff09;时&#xff0c;要避免成为“沟通黑洞”&#xff0c;必须聚焦目标清晰、需求拆解、协同评审、持续迭代等关键点。其中&#xff0c;协同评审尤其重要——通过在文档完成初期就邀请相关部门共同审阅讨论&#xff0c;可以及早发现需求逻辑…

巧用符号链接搬移C盘中的软件数据目录到其他盘

#工作记录 我们知道&#xff0c;在Windows11系统&#xff0c;有些软件是不能指定安装目录的&#xff0c;有些软件即使指定了安装目录可是在更新版本之后还是会安装到默认的C盘目录中&#xff08;比如剪映&#xff09;&#xff0c;而且每次安装某些软件之后&#xff0c;这些软件…

使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化

使用 PIC 微控制器和 Adafruit IO 的基于 IoT 的 Web 控制家庭自动化 家庭自动化一直是我们大多数人的灵感来源。从我们舒适的椅子或任何房间的床上切换交流负载,而无需伸手去触碰另一个房间的开关,听起来很酷,不是吗!.现在,在物联网时代,多亏了 ESP8266 模块,它使从世界…

【Java篇】一气化三清:类的实例化与封装的智慧之道

文章目录 类和对象&#xff08;中&#xff09;五、对象的构造及初始化5.1 如何初始化对象5.2 构造方法5.2.1 构造方法的概念5.2.2 构造方法的特性 5.3 默认初始化5.4 就地初始化 六、封装6.1 封装的概念6.2 访问限定符6.3 封装扩展之包6.3.1 包的概念6.3.3导入包6.3.3全类名6.3…

VMware上调整centos终端的背景颜色

目录 1. 正常打开一个终端&#xff0c;背景颜色默认为白色 2. 在打开的终端页面上右击&#xff0c;选择“配置文件首选项” 3. 取消默认勾选的 “使用系统主题中的颜色” 即可 1. 正常打开一个终端&#xff0c;背景颜色默认为白色 2. 在打开的终端页面上右击&#xff0c;选择…

Latex2024安装教程(附安装包)Latex2024详细图文安装教程

文章目录 前言一、Latex2024下载二、Texlive 2024安装教程1.准备安装文件2.启动安装程序3.配置安装选项4.开始安装5.安装完成6.TeX Live 2024 安装后确认 三、Texstudio 安装教程1.准备 Texstudio 安装2.启动 Texstudio 安装向导3.选择安装位置4.等待安装完成5.启动 Texstudio6…

用了Cline和华为云的大模型,再也回不去了

这两年AI火热&#xff0c;受影响最大的还是程序员群体&#xff0c;因为编程语言是高度形式化的&#xff0c;完全可以用BNF等形式精确地定义&#xff0c;不像自然语言那样&#xff0c;容易出现歧义。另外开源是软件界的潮流&#xff0c;GitHub上有海量的开源代码可供AI来训练&am…

详细解析格式化消息框的代码

书籍&#xff1a;《windows程序设计(第五版)》的开始 环境&#xff1a;visual studio 2022 内容&#xff1a;格式化消息框 说明&#xff1a;以下内容大部分来自腾讯元宝。 封装MessageBoxPrintf 在MessageBoxPrintf()中处理可变参数&#xff0c;通过va_list机制&#xff0c…

Jetson Nano 三个版本(B01 4GB、Orin 4GB、Orin 8GB)本地部署Deepseek等大模型的测评

Jetson Nano三个版本&#xff08;B01 GB、Orin 4GB、Orin 8GB&#xff09;本地部署Deepseek等大模型的测评 一、为什么要在终端设备部署大模型&#xff1f;二、 Jetson Nano推理大模型时计算资源占用情况分析为什么测试Jetson Nano?三款Jetson Nano芯片简介 三、大模型推理实验…

mac calDAV 日历交互

安装Bakal docker https://sabre.io/dav/building-a-caldav-client/ 在Bakal服务器上注册账户 http://localhost:8080/admin/?/users/calendars/user/1/ 在日历端登录账户&#xff1a; Server: http://127.0.0.1:8080/dav.php Server Path: /dav.php/principals/lion No e…

数据库监控:确保业务连续性和用户体验

在数字化时代&#xff0c;数据库作为企业的数据心脏&#xff0c;其重要性不言而喻。无论是交易系统、客户关系管理系统&#xff0c;还是数据分析平台&#xff0c;都离不开数据库的支撑。然而&#xff0c;数据库的运行状态和性能直接影响着企业的业务连续性和用户体验。因此&…

PointVLA:将 3D 世界注入视觉-语言-动作模型

25年3月来自美的集团、上海大学和华东师大的论文“PointVLA: Injecting the 3D World into Vision-Language-Action Models”。 视觉-语言-动作 (VLA) 模型利用大规模 2D 视觉语言预训练&#xff0c;在机器人任务方面表现出色&#xff0c;但它们对 RGB 图像的依赖&#xff0c;…

SpringBoot-MVC配置类与 Controller 的扫描

文章目录 前言一、自动配置类位置二、自动配置类解析2.1 WebMvcAutoConfiguration2.1.1 EnableWebMvcConfiguration 2.2 DispatcherServletAutoConfiguration 三、RequestMapping 的扫描过程3.1 RequestMappingHandlerMapping#afterPropertiesSet3.2 RequestMappingHandlerMapp…

企业年度经营计划制定与管理方法论(124页PPT)(文末有下载方式)

资料解读&#xff1a;企业年度经营计划制定与管理方法论 详细资料请看本解读文章的最后内容。 在企业的发展进程中&#xff0c;年度经营计划的制定与管理至关重要&#xff0c;它犹如企业前行的导航图&#xff0c;指引着企业在复杂多变的市场环境中稳健发展。这份《企业年度经营…

基于微信小程序的充电桩管理系统

一、开发背景 在开发充电汽车管理系统之前&#xff0c;深入的需求分析至关重要。我们要充分了解不同用户群体的需求&#xff0c;比如私家车主希望充电过程便捷、高效、安全&#xff0c;能够实时查看充电状态和费用明细&#xff1b;出租车、网约车司机则更注重充电速度和充电桩…

算法模型从入门到起飞系列——递归(探索自我重复的奇妙之旅)

文章目录 前言一、递归本质1.1 递归的要素1.2 递归特点 二、递归&迭代2.1 递归&迭代比较2.2 递归&迭代如何实现相同功能2.2.1 递归实现2.2.2 迭代实现2.2.3 性能对比 三、优雅的递归理解3.1 阶乘计算分解3.2 [DFS](https://blog.csdn.net/qq_38315952/article/deta…

YOLO+OpenCV强强联手:高精度跌倒检测技术实战解析

目录 关于摔倒检测 摔倒检测核心逻辑 摔倒检测:联合多种逻辑判断 原理详细解释 1. 导入必要的库 2. 定义函数和关键点连接关系 3. 筛选有效关键点并计算边界框 4. 计算人体上下半身中心点和角度 5. 绘制关键点和连接线 6. 绘制角度标注和检测跌倒 7. 返回处理后的图…

麒麟银河V10服务器RabbitMQ安装

安装步骤 rabbitMQ依赖于erlang的环境&#xff0c;所以需要先安装erlang&#xff0c;erlang跟rabbitMQ是有版本之间的关联关系的&#xff0c;根据对应的版本去安装下载&#xff0c;保证少出问题。 可以通过官网来查看RabbitMQ和erlang之间的版本对应关系 rabbitMQ和erlang之间…