友元函数,友元类,内部类及其之间的关系,匿名对象等

news2024/10/7 12:21:36

TIPS

  1. 当某一个类当中有自定义类型成员变量的时候,然后对该类的实例化对象调用函数的时候走初始化列表的时候,如果说要对自定义类型成员变量进行初始化列表初始化的时候,尽管那个自定义类型它的构造函数是没有参数的,但是此时括号是不能够省略掉的
class A
{
public:
	A()
		:a1(0)
		,b1(0)
		,c1(0)
	{
	}
private:
	int a1;
	int b1;
	int c1;
};
class B
{
public:
	B()
		: a2(0)
		, b2(0)
		, c2(0)
		, aa()  //注意
	{
	}
private:
	int a2;
	int b2;
	int c2;
	A aa;
};
  1. 在函数重载当中去判断参数的类型的时候,是否被const修饰也是会影响类型的,尽管他们可能是同一个数据类型。
  2. 在我们之前也讲过,两个函数尽管构成了函数重载,但是实际上还有可能会发生对于重载函数调用不明确的问题,这个问题出现的原因主要在于有时候尽管两个函数已经是构成了函数重载,但是你实际在传参的时候,你会发现这两个函数它都是可以去匹配实参的,所以说就会发生调用不明确的问题
  3. 如果说一个函数它是返回实例化对象的时候,如果说他是传值返回,那么就会发生拷贝构造,但如果说他是引用返回的话,就不存在这个问题,所以说函数的引用返回的话它的效率是要更高一点

友元函数

  1. 友元函数可以直接访问类的私有成员它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字
  2. 在这里插入图片描述
  3. 代码样本:
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class Stu
{
	friend ostream& operator<<(ostream& out, Stu& s);
public:
	//构造函数
	Stu(int size = 10)
		:_namesize(size)
		,_age(0)
		, _score(0)
	{
		_name = (char*)malloc(sizeof(char) * _namesize);
		if (_name == nullptr)
		{
			perror("malloc failed");
			return;
		}
	}
	//拷贝构造函数
	Stu(const Stu& s)
	{
		_namesize = s._namesize;
		_age = s._age;
		_score = s._score;
		_name = (char*)malloc(sizeof(char) * _namesize);
		if (_name == nullptr)
		{
			perror("malloc failed");
			return;
		}
		memcpy(_name, s._name, sizeof(char) * (_namesize + 5));
	}
	//赋值运算符重载
	Stu& operator=(const Stu& s)
	{
		_namesize = s._namesize;
		_age = s._age;
		_score = s._score;
		_name = (char*)malloc(sizeof(char) * (_namesize + 5));
		if (_name == nullptr)
		{
			perror("malloc failed");
			exit(-1);
		}
		memcpy(_name, s._name, sizeof(char) * (_namesize + 5));
		return *this;
	}
	//输入信息
	void InputInfo()
	{
		cout << "依次输入学生的姓名,年龄与成绩";
		cin >> _name >> _age >> _score;
	}
	//析构函数
	~Stu()
	{
		free(_name);
	}
	//获取学生姓名
	char* GetName()const 
	{
		return _name;
	}
	//获取学生年龄
	int GetAge()const
	{
		return _age;
	}
	//获取学生成绩
	int GetScore()const
	{
		return _score;
	}
private:
	char* _name;
	int _namesize;
	int _age;
	int _score;
};
//输出信息1
ostream& operator<<(ostream& out, Stu& s)
{
	cout << s.GetName() << " " << s.GetAge() << " " << s.GetScore() << endl;
	return out;
}
int main()
{
	Stu s1(20);
	s1.InputInfo();

	Stu s2 = s1;
	s1.InputInfo();

	cout << s1;
	cout << s2;
	return 0;
}
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class Stu
{
	friend ostream& operator<<(ostream& out, Stu& s);
public:
	//构造函数
	Stu(int size = 10)
		:_namesize(size)
		,_age(0)
		, _score(0)
	{
		_name = (char*)malloc(sizeof(char) * _namesize);
		if (_name == nullptr)
		{
			perror("malloc failed");
			return;
		}
	}
	//拷贝构造函数
	Stu(const Stu& s)
	{
		_namesize = s._namesize;
		_age = s._age;
		_score = s._score;
		_name = (char*)malloc(sizeof(char) * _namesize);
		if (_name == nullptr)
		{
			perror("malloc failed");
			return;
		}
		memcpy(_name, s._name, sizeof(char) * (_namesize + 5));
	}
	//赋值运算符重载
	Stu& operator=(const Stu& s)
	{
		_namesize = s._namesize;
		_age = s._age;
		_score = s._score;
		_name = (char*)malloc(sizeof(char) * (_namesize + 5));
		if (_name == nullptr)
		{
			perror("malloc failed");
			exit(-1);
		}
		memcpy(_name, s._name, sizeof(char) * (_namesize + 5));
		return *this;
	}
	//输入信息
	void InputInfo()
	{
		cout << "依次输入学生的姓名,年龄与成绩";
		cin >> _name >> _age >> _score;
	}
	//析构函数
	~Stu()
	{
		free(_name);
	}
private:
	char* _name;
	int _namesize;
	int _age;
	int _score;
};
//输出信息2
ostream& operator<<(ostream& out, Stu& s)
{
	cout << s._name << " " << s._age << " " << s._score << endl;
	return out;
}
int main()
{
	Stu s1(20);
	s1.InputInfo();

	Stu s2 = s1;
	s1.InputInfo();

	cout << s1;
	cout << s2;
	return 0;
}

友元类

  1. 友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
  2. 友元关系是单向的,不具有交换性。
  3. 就是我的类成为你的类的朋友,那么在我的类当中可以随便去访问你的私有成员
  4. 代码样本
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
class Time
{
	friend class date;
public:
	Time()
		:_hours(0)
		,_minutes(0)
		,_seconds(0)
	{
	}
private:
	int _hours;
	int _minutes;
	int _seconds;
};
class date
{
public:
	date()
		: _years(2000)
		, _months(1)
		, _days(1)
		, _t()
	{
	}
	void Show()
	{
		cout << _years << "年" << _months << "月" << _days << _t._hours << "时" << _t._minutes << "分" << _t._seconds << "秒" << endl;
	}
private:
	int _years;
	int _months;
	int _days;
	Time _t;
};
int main()
{
	date d;
	d.Show();
	return 0;
}

内部类

  1. 一般来说类都是定义在全局当中,但也有情况就会发生:类B居然定义在某个其他类A的类域当中,这个就是内部类。但除非它B创建了一个实例化对象,否则的话是完全没有占任何空间,因为B那仅仅是一个声明而已,根本就不会占任何空间(创建实例化对象除外)。现在假设要在main函数里面去创建一个类B的实例化对象,不能直接这么去创建,需要用域作用限定符去指定一下命名搜索顺序,即:A::B b1; 这样子。
    在这里插入图片描述
    注:在用sizeof计算类的实例化对象的大小的时候,对于静态成员变量是不需要计算进去的,因为静态成员变量它并不是存在类的实例化对象当中,它是存在内存的静态区当中了
  2. 然后这个内部类,比如说上面这个类B,如果说他是定义在类A的私有区域当中,那么这样子的话,在类A的外面是怎么样都没有办法去访问的,因此内部类的话是受到访问限定符的限制的。在这里插入图片描述
  3. 内部类是外部类的天生友元,注意并不是互相友元,是对于内部类你可以想象成小棉袄一样,有特殊优惠。于此同时,需要认识到:友元类之间涉及到的是类的私有成员变量的访问限制问题
  4. 并且在某个类当中,我们知道相当于是不受访问限定符的限制,各个平级关系的话,都是可以互相之间进行访问,但如果并不是平级的,就说相当于有代际差异(比如说内部类), 那这时候又需要另外去考虑

在这里插入图片描述

内部类使用的例子

luck
在这里插入图片描述

class Solution 
{
    //内部类
    class Sum
    {
    public:
        Sum()
        {
            s+=i;
            i++;
        }
    };
public:
    int Sum_Solution(int n) 
    {
        Sum arr[n];  
        return s;
    }
private:
    static int i;
    static int s;
};
int Solution::i=1;
int Solution::s=0;

关于友元类,友元函数与外部类的关系

在这里插入图片描述

匿名对象

  1. 匿名对象的生命周期只有在那一行,也就是说是即用即销毁。
  2. 他与普通对象都是一样往构造函数当中去传参,只不过是没有名字而已并且构造函数内部如果没有参数可以传的话,它的括号不能够省略
class A
{
public:
	A(int a, int b)
		:_a(a)
		,_b(b)
	{
	}
	A()
	{
	}
private:
	int _a = 1;
	int _b = 1;
};
int main()
{
	A(1, 3);
	A();
	return 0;
}
  1. 与之前讲的临时变量一样,匿名对象具有常性;如果说对匿名对象进行普通的引用的话,那么相当于权限会放大,那么就是不行的。如果是进行const 引用,那么相当于是权限的平移,那是可以进行引用的。并且一旦匿名对象被引用了之后,他可以延长匿名对象的生命周期,生命周期延申到当前函数的局部域。强行续命
  2. 并且匿名对象没有个数限制,你想创建多少个就可以创建多少个

再次理解类和对象

现实生活中的实体计算机并不认识,计算机只认识二进制格式的数据。如果想要让计算机认识现实生活中的实体,用户必须通过某种面向对象的语言,对实体进行描述,然后通过编写程序,创建对象后计算机才可以认识。比如想要让计算机认识洗衣机,就需要:

  1. 用户先要对现实中洗衣机实体进行抽象—即在人为思想层面对洗衣机进行认识,洗衣机有什么属性,有那些功能,即对洗衣机进行抽象认知的一个过程
  2. 经过1之后,在人的头脑中已经对洗衣机有了一个清醒的认识,只不过此时计算机还不清楚,想要让计算机识别人想象中的洗衣机,就需要人通过某种面相对象的语言(比如:C++、Java、Python等)将洗衣机用类来进行描述,并输入到计算机中
  3. 经过2之后,在计算机中就有了一个洗衣机类,但是洗衣机类只是站在计算机的角度对洗衣机对象进行描述的,通过洗衣机类,可以实例化出一个个具体的洗衣机对象,此时计算机才能洗衣机是什么东西。
  4. 用户就可以借助计算机中洗衣机对象,来模拟现实中的洗衣机实体了。在类和对象阶段,大家一定要体会到,类是对某一类实体(对象)来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。
    在这里插入图片描述

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

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

相关文章

数据剖析更灵活、更快捷,火山引擎 DataLeap 动态探查全面升级

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 近期&#xff0c;火山引擎 DataLeap 上线“动态探查”能力&#xff0c;为用户提供全局数据视角、完善的抽样策略&#xff0c;提高数据探查的灵活度以及响应速率。 …

【STL模版库】string类:模拟实现string类

一、成员变量 private:char *_str;size_t _size;size_t _capacity;public:static size_t npos -1; //编译报错&#xff0c;不能在类中初始化const static size_t npos -1; //[1]const char* c_str() const{ //[2]return _str;}size_t size() const{return _size;} size_t ca…

智慧水务云平台助力“十四五”水安全保障规划!

一、《“十四五”水安全保障规划》 水利部印发《“十四五”水安全保障规划》&#xff0c;规划中指出&#xff0c;“十四五”期间要抓好8个方面重点任务。 一是实施国家节水行动&#xff0c;强化水资源刚性约束。 二是加强重大水资源工程建设&#xff0c;提高水资源优化配置能…

Mongo执行计划explain分析

3.0+的explain有三种模式,分别是:queryPlanner、executionStats、allPlansExecution。现实开发中,常用的是executionStats模式。 1.使用方式 在查询语句后面加上explain("executionStats") db.user.find({"roleCodes":"xsbj","status&…

详细操作Selenium自动化测试之中的断言

Selenium常用的断言包括 页面属性断言&#xff1a;断言标题、url或页面源码中是否包含或不包含特定字符元素存在断言&#xff1a;断言指定元素存在图片及链接断言&#xff1a;断言图片正常显示、链接可以正常打开 页面属性断言 这是最常用的断言方式&#xff0c;可以用来断言…

TTL转HDMI 1.4,性能提升,pin to pin 芯片LT8618SXB

1. 描述 LT8618SX 是 Lontium 的低功耗版本 HDMI 发射器&#xff0c;其基于 ClearEdgeTM 技术。它支持 24 位色深 HDMI 1.4&#xff08;高清多媒体接口&#xff09;规范。它们与 Lontium 的第一代 HDMI 发射器 LT8618EX 完全向后兼容。 LT8618SX 是一款高性能、低功耗器件…

干货分享!9大Python常用技巧!

介绍 Python 炫酷功能&#xff08;例如&#xff0c;变量解包&#xff0c;偏函数&#xff0c;枚举可迭代对象等&#xff09;的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此&#xff0c;本文会试着介绍一些其它文章没有提到的小技巧&#xff0c;这些小技巧也是…

csgo搬砖项目,时间自由,项目包下车,包落地

Steam是一款全球较大的综合性数字游戏软件发行平台。steam同时在线飙到3300万&#xff01;超越你说熟悉的王者&#xff0c;吃鸡&#xff01;用户多&#xff0c;竞争者少&#xff0c;连我自己都没想到&#xff0c;有一天我居然可以靠着steam游戏搬砖来赚钱养活自己。 实话实说&a…

计算机基础--->数据结构(1)【图的存储和遍历】

文章目录 图图的存储图的搜索&#xff08;无向无权图&#xff09;代码演示 图 图中包含 顶点、边、度&#xff0c;无向图&#xff0c;有向图&#xff0c;无权图&#xff0c;带权图&#xff0c;其中 度表示一个顶点包含多少条边&#xff0c;有出度和入度。 图的存储 邻接矩阵 代…

【LeetCode】13,罗马数字转整数。 难度等级:简单。知识点:map和unordered_map的区别

文章目录 一、题目二、初级解法&#xff1a;顺序遍历字符串我的解法&#xff08;语法平平无奇&#xff09;语法接近 三、精妙解法&#xff1a;逆序遍历字符串四、知识点&#xff1a;map和unordered_map的区别 LeetCode 第13题&#xff0c;罗马数字转整数&#xff1b;难度等级&a…

大厂视频面试,因为截屏作废

大厂视频面试现在这么严格了么&#xff1f;无意间按到截屏直接显示面试作废&#xff0c;好在最后和HR解释了下&#xff0c;再约时间重新面。 作为一个面试过3、4家大厂&#xff0c;现在在鹅厂工作的过来人来说&#xff0c;上面遇到的这个问题是AI面&#xff0c;不用太担心&…

React项目总结:上一步的终点,下一步的起点

项目简介 本人利用 react18.2 json-server 做了一个后台管理系统。 包含&#xff1a; 用户管理权限管理站内信审核管理站内信发布管理 等内容。 其中涉及到react-router V6.0的使用以及一些权限控制等内容。 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff…

Makefile基础教程(函数的使用)

文章目录 前言一、自定义函数1.使用示例2.注意事项 二、预定义函数1.call函数2.abspath函数 总结 前言 在Makefile中也是存在函数的&#xff0c;在 Makefile 中&#xff0c;可以使用函数调用来处理变量、字符串和路径等操作。那么下面就来看看是如何在makefile中使用函数的吧。…

计算机网络基础(四)—— 什么是TCP/IP协议?是两种网络协议?

文章目录 01 | &#x1f353; 概念 \color{red}{概念} 概念&#x1f353;02 | &#x1f34a; T C P / I P 分层模型 \color{orange}{TCP/IP分层模型} TCP/IP分层模型&#x1f34a;03 | &#x1f34b; 数据链路层协议 \color{yellow}{数据链路层协议} 数据链路层协议&#x1f34…

景区剧本杀小程序

景区剧本杀具有以下几个方面的前景&#xff1a; 景区旅游升级&#xff1a;随着人们对于景区旅游体验的多样化需求增加&#xff0c;景区剧本杀作为一种互动性强、参与感强的旅游体验项目&#xff0c;将会得到越来越多游客的喜爱和关注。 移动互联网应用&#xff1a;景区…

C++ 有元 内部类 匿名对象

有元 使用有元就可以突破封装&#xff0c;可以直接对类当中 私有的 成员 成员函数等等进行访问&#xff0c;在某一次上提供了遍历&#xff0c;但是这增大的 耦合性&#xff0c;破坏了封装&#xff0c;所以建议有元不要多用。 所谓耦合性就是 &#xff0c;某两个 东西的 关系&a…

程序员开发Linux常用命令

本文对程序开发过程中常用的Linux命令进行总结&#xff0c;随时进行补充&#xff0c;属于科普篇&#xff0c;希望对大家有所帮助 file命令 该命令用于查看文件的基本信息&#xff0c;比如编码格式&#xff0c;文件类型等信息&#xff0c;对于可执行程序或者动态链接库文件&am…

【Python入门知识】类和对象,要想学的好基础得打好

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! Python 类/对象 Python 是一种面向对象的编程语言。 Python 中的几乎所有东西都是对象&#xff0c;拥有属性和方法。 类&#xff08;Class&#xff09;类似对象构造函数&#xff0c;或者是用于创建对象的“蓝图”。 创建…

Java 判空的常见方法

一、 对象判空 if (obj ! null) {// 进行对象非空判断 }Object obj null; // 或者 obj new Object(); if (obj null) {// 对象为空 }另外&#xff0c;Guava 库还提供了一个更方便的方法&#xff0c;使用方式如下&#xff1a; import com.google.common.base.Objects;if (O…

SOLIDWORKS 30个实用小技巧

很多人在学习SolidWorks时&#xff0c;会有很多疑问&#xff0c;都不知道如何解答&#xff0c;所以走了很多弯路。今天&#xff0c;我们就来讲讲在学习SolidWorks中的那些小技巧吧&#xff01; 1、SOLIDWORKS技巧之按“空格键&#xff1a;”弹出快捷菜单双击某一视图&#xff0…