类和对象 02【C++】

news2024/11/16 17:27:19

文章目录

  • 一、 构造函数(初始化列表)
    • 1. 初始化列表
    • 2. explicit 关键字
    • 3. static成员
  • 二、 友元
    • 1. 友元函数
    • 2.友元类
  • 三、 内部函数
  • 四、 匿名对象
  • 五、 拷贝对象时的一些编译器优化

一、 构造函数(初始化列表)

进一步理解构造函数,我们知道创建对象时,编译器通过构造函数,初始化对象,给对象中的成员变量一个合适的初始值

平时我们写的构造函数,以日期类为例:

class Date 
{
public:
	Date(int year,int month,int day) 
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
//成员声明
	int _year;
	int _month;
	int _day;
};

上述构造函数调用后,对象有了初始值,但是不能将其称为对 对象中的成员变量的初始化,而是在构造函数体进行赋值的
构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以进行多次赋值

1. 初始化列表

初始化列表: 以一个冒号开始,接着就是用逗号分隔的数据成员列表,每个成员变量后面跟一个放在括号中的初始值或者是表达式

	//初始化列表
	Date(int year, int month, int day)
		:_year(year),
		_month(month),
		_day(day)
	{}

上述用于完成日期类的初始化

对于普通构造函数可能会:
在这里插入图片描述
当对象实例化后,对象要进行整体定义,每个成员要去调用构造函数,每个成员需要有定义初始化的地方,在C++中,构造函数的初始化列表,就是每个成员定义初始化的地方

在这里插入图片描述

成员变量定义初始化,上图_year _month _day 也会走初始化列表,只是没有给值,所以是随机值

在这里插入图片描述
上述给值,是缺省值,这个值是给初始化列表用的

  • 当初始化列表没有显示初始化的时候,回去调用缺省值(有缺省值的时候就初始化缺省值,否则就给随机值)
  • 当初始化列表初始化了,就直接初始化(不会去用缺省值了,因为初始化列表,已经初始化了)

所以当没有使用初始化列表,才会使用缺省值

在这里插入图片描述
先走初始化列表,再走函数体

能用初始化列表就用初始化列表

	Date(int year,int month,int day)
		:_year(year),
		_month(month),
		_day(day),
		_n(1)
	{}

我们知道一些成员定义的时候必须走初始化列表

const int _n;	//const修饰的变量
int&  _ref;			//引用必须在定义的时候初始化
class Date 
{
public:
	Date(int year,int month,int day,int& x)
		:_year(year),
		_month(month),
		_day(day),
		_n(1),
		_ref(x)
	{
	}
private:
	int _year;
	int _month;
	int _day;

	const int _n;	//const修饰的变量
	int& _ref;			//引用必须在定义的时候初始化
};

在这里插入图片描述

当我们不写,编译器自动生成的默认构造函数,对于内置类型不做处理,对于自定义类型去调用它的默认构造

自定义类型的成员变量必须放在初始化列表位置进行初始化(没有默认构造函数时)
在这里插入图片描述

下方代码,初始化列表中没有写对自定义成员的初始化,这里的自定义成员回去调用它自己的默认构造

class A 
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a = 0)" << endl;
	}
private:
	int _a;
};
class Date 
{
public:
	Date(int year,int month,int day,int& x)
		:_year(year),
		_month(month),
		_day(day),
		_n(1),
		_ref(x)
	{
	}
private:
	int _year;
	int _month;
	int _day;

	const int _n;	//const修饰的变量
	int& _ref;		//引用必须在定义的时候初始化
	A _aa;			//自定义类型的成员变量
};

当自定义成员没有默认构造,初始化列表中也没有定义初始化时
会报错(没有合适的默认构造函数可以用)
在这里插入图片描述
当自定义类型 初始化列表和默认构造都写的情况下,会走初始化列表

初始化列表注意点

  • 每个成员变量在初始化列表中只能初始化一次

  • 类中的以下成员必须在初始列表位置进行初始化

    • 引用成员变量
    • const成员变量
    • 自定义类型成员变量(没有写默认构造函数的情况下)
      上述三个不能在函数体内初始化
  • 其他成员变量可以在初始化列表,也可以在函数体内,建议在初始化列表,当然也可以混着使用

class Date 
{
public:
	Date(int year,int month,int day,int& x)
		:_year(year),
		_month(month),
		_day(day),
		_p((int*)malloc(sizeof(4)))
	{

		if (_p == nullptr)
		{
			perror("malloc fail");
			exit(-1);
		}
	}
private:
	int _year;
	int _month;
	int _day;
	int* _p;
};
  • 成员变量在类中声明的顺序就是其在初始化列表中的初始化顺序,与初始化列表中的先后次序无关

分析下方代码:

class A
{
public:
  A(int a)
   :_a1(a)
   ,_a2(_a1)
 {}
 
  void Print() {
    cout<<_a1<<" "<<_a2<<endl;
 }
private:
  int _a2;
  int _a1;
};
int main() {
  A aa(1);
  aa.Print();
}

//
A. 输出1  1
B.程序崩溃
C.编译不通过
D.输出1  随机值

答案是: 选项D
因为成员变量在类中声明的顺序,就是初始化的顺序,在初始会去走初始化列表
先走_a2,但是此时_a1还是随机值,所以_a2为随机值,之后再走_a1,_a1的值初始化为1
打印结果 先打印_a1,再打印_a2 的结果
在这里插入图片描述

2. explicit 关键字

在C++中,explicit关键字主要用于类的构造函数声明中,它的主要目的是阻止隐式类型转换的发生。当一个类的构造函数被声明为explicit时,编译器将不会使用这个构造函数进行任何自动类型转换。

先看一下类型转化

//类型转换
	int i = 1;
	//double& b = i;	//error,类型转换产生临时变量,临时变量具有常性
	const double &b = i;	//所以这里要加上一个const
	
	//对于自定义类型
	// A& aa3 = 2;	//error,原因是 (单参数构造函数支持隐式类型转换,类型转换产生临时变量)aa3引用的不是2,而是临时变量,临时变量具有常性
	const A& aa3 = 3; //内置类型赋值给自定义类型,发生隐式类型转换

对于单参数构造函数支持隐式类型转换

class A 
{
public:
	//构造
	A(int x = 0)
		:_x(x)
	{}
	构造
	//explicit A(int x = 0)	//如果不想让隐式类型转换发生,使用explicit
	//	:_x(x)
	//{}
	//拷贝构造
	A(const A &aa)
	{
		cout << "	A(const A &aa)" << endl;
	}

private:
	int _x;
};
int main() 
{
	A aa1(6);	//构造
	//单参数构造函数支持隐式类型转换
	//这里5先去调用构造A的一个临时对象,然后再去拷贝构造
	A aa2 = 5;
	//不同类型之间进行赋值,中间会产生临时对象 (所以会构造+拷贝构造)
	//但是 有些编译器会优化 同一个表达式连续步骤的构造,一般会被合二为一,把拷贝构造给合并了
	return 0;
}  

在C++98中是不支持多参数隐式类型转换的,C++11是支持多参数隐式类型转换的

	D dd1 = {6,6};

上述的隐式类型转换,如果不想让其发生则需要,使用explicit 关键字

	explicit A(int x = 0)	//如果不想让隐式类型转换发生,使用explicit
		:_x(x)
	{}

给成员变量缺省值的一些情况

	//给缺省值
	int _a = 1;
	int* p = (int*)malloc(4);
	D dd1 = {1,2};

3. static成员

声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化

例如:
实现一个类,计算程序中创建了多少个类对象

//static 成员
//实现一个类,计算程序中创建了多少个类对象

int  n = 0;	//用一个全局变量去计算构造函数走了多少次
class A 
{
public:
	A() 
	{
		++n;
	}
	A(const A& aa) 
	{
		++n;
	}
};
A func() 
{
	A aa;
	return aa;
}
int main() 
{
	A aa1;
	A aa2;
	func();
	cout << n << endl;
	//对于创建多少个类对象,我们可以去统计构造函数构造了多少次
	return 0;
}

对于上方代码,全局变量n是很容易让修改的,所以把 n封装,使其不被修改

// 上述的n容易被修改
// 所以把 n封装,使其不被修改
class A
{
public:
	A(){ ++n; }
	A(const A& aa){++n;}
	
	 //静态成员函数
	//静态成员函数和普通的成员函数的区别是,静态成员函数没有this指针
	//静态成员变量的特点是:比如定义一个全局的又想用类进行封装,那就可以定义静态成员变量
	//访问静态成员变量,提供对应的静态成员函数,来访问静态成员变量
	 static int GetN() 
	 {
		 return n;
	 }
private:
	//int n = 0; //这样是不能加上同一个n的
	//声明
	static int n;	//注意这里的n不是属于某一个对象,而是属于所有对象,属于整个类,要在类外面进行定义
};

//定义,静态成员变量一定要在类外进行初始化
int A::n = 0;

A func()
{
	A aa;
	return aa;
}
int main()
{
	A aa1;
	A aa2;
	func();
	//对于私有的情况下,获取n要提供一个类中的公有成员函数getter
	cout <<aa1.GetN()<< endl;
	cout << A::GetN()<< endl;	//静态成员函数允许类域访问
	//对于创建多少个类对象,我们可以去统计构造函数构造了多少次
	return 0;
}

注意:定义和初始化静态成员变量一定要在类外进行
在这里插入图片描述
所以,静态成员变量可以在类里面声明,但是定义和初始化是在类外面进行的在C++中,静态成员变量在类外部定义和初始化是为了确保它们在整个程序范围内唯一存在、正确初始化以及避免多重定义的问题

static成员小总结:

  • 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
  • 静态成员变量必须在类外定义,定义时不用加static关键字,类中只是声明
  • 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  • 静态成员函数没有隐藏的this指针,不能访问任何非静态成员
  • 静态成员也是类的成员,也受访问限定符的限制

二、 友元

“友元”(Friend)是一个特殊的访问权限控制机制。
友元提供了一种突破封装的方式,为有些情况提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。

友元 分为 友元函数友元类

1. 友元函数

在重载操作符流插入 << 和流提取 >> 时,一般写成全局的函数才能完成。函数去访问成员变量时,受到封装的限制,要获取封装的成员变量,使用getter和setter来完成。

但是使用友元函数去封装类中声明,就可以获取到访问私有(private)和保护(protected)成员的权限
例如 重载操作符流插入 << 和流提取 >> 使用 友元去封装的类进行声明,声明时需要加friend关键字

friend ostream& operator<<(ostream& out, const Date& d);
friend istream& operator>>(istream& in,Date& d);

那为什么 重载操作符流插入 << 和流提取 >> 要写成全局的函数呢?

因为如果写成 成员函数cout的输出流对象和隐含的this指针会抢占第一个参数的位置。this指针默认是第一个参数(左操作数),实际情况是cout的输出流对象需要是第一个参数位置才可以,所以要operator<<重载成全局函数。operator>>同理。

友元函数小总结:

  • 友元函数可以访问类的私有和保护成员,但不是类的成员函数
  • 友元函数不能用const修饰
  • 友元函数可以在类定义的任何地方声明,不受访问限定符限制
  • 一个函数可以是多个类的友元函数
  • 友元函数的调用与普通函数调用原理相同

2.友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员

//友元类
class Time
{
	//声明 日期类 为 时间类 的友元类,则日期类就可以直接访问时间类的私有成员变量
	friend class Date;
public:
	Time(int hour = 0,int minute = 0,int second = 0) 
		:_hour(hour)
		,_minute(minute)
		,_second(second)
	{}
private:
	int _hour;
	int _minute;
	int _second;
};

class Date 
{
public:
	Date(int year = 1970,int month = 1,int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{}
	void set_tmie_date(int hour,int minute,int second)
	{
		//可以直接访问时间类的成员变量
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}


private:
	int _year;
	int _month;
	int _day;

	Time _t;
};

友元类 小总结:

  • 友元关系是单向的,不具有交换性。
    如 上述Time类和Date类,在Time类中声明Date类为其友元类,那么可以在Date类中直接访问Time类的私有成员变量,但想在Time类中访问Date类中私有的成员变量则不行

  • 友元关系不能传递。如果C是B的友元, B是A的友元,则不能说明C时A的友元

  • 友元关系不能继承

三、 内部函数

一个类定义在另一个类的内部,这类叫做内部类
内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。
内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员(外部类不是内部类的友元)

class A 
{
public:
	class B 
	{
	private:
		int _b1;
	};
private:
	int _a1;
	int _a2;
};

小总结:

  • 内部类可以定义在外部类的public、protected、private都是可以的
  • 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象。
  • sizeof(外部类)=外部类,和内部类没有任何关系

例题:
JZ64 求1+2+3+…+n
求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

(1) 方法1不使用内部类

class Sum
{
public:
    Sum()
    {
        _ret += _i;
        _i++;
    }
    static int get() //通过静态成员函数来返回私有静态成员变量
    {
        return _ret;
    }
private:
    //静态成员变量,类内部声明
    static int _ret;
    static int _i; 
};
//静态成员变量,类外部定义和初始化
int Sum::_ret = 0;
int Sum::_i = 1;

class Solution {
public:
    int Sum_Solution(int n) {
        Sum arr[n]; //数组构造n个Sum类型的对象
        return Sum::get();
    }
};

(2) 使用内部类

class Solution {
    class Sum
    {
    public:
        Sum() 
        {
            _ret += _i;
            _i++;
        }
    };

public:
    int Sum_Solution(int n) {
        Sum arr[n];
        return _ret;
    }
private:
    static int _ret;
    static int _i;
};
int Solution::_ret = 0;
int Solution::_i = 1;

四、 匿名对象

在C++中,匿名对象是指没有显式名称的对象,通常用于临时存储数据或执行某些操作。这些对象在创建后会立即被初始化,并且通常只在当前的代码块或表达式中有效。

首先 一般情况下都是定义有名对象
例如:
在这里插入图片描述
那么 匿名对象,就没有上述的a1名字

	A(2);	//匿名对象
	A a1(1);//有名对象
	A(2);	//匿名对象,好处就是不用取名字,生命周期只有一行,运行完这一行就会自动调用析构函数
	//有名对象
	Solution s1;
	s1.Sum_Solution(10);
	
	//匿名对象
	Solution().Sum_Solution(1);

匿名对象,好处就是不用取名字,生命周期只有一行,运行完这一行就会自动调用析构函数

五、 拷贝对象时的一些编译器优化

在传参和传返回值的过程中,一般编译器会做一些优化,减少对象的拷贝

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "A(int a)" << endl;
	}
	A(const A& aa)
		:_a(aa._a)
	{
		cout << "A(const A& aa)" << endl;
	}
	A& operator=(const A& aa)
	{
		cout << "A& operator=(const A& aa)" << endl;
		if (this != &aa)
		{
			_a = aa._a;
		}
		return *this;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};
void f1(A aa)
{}
A f2()
{
	A aa;
	return aa;
}

int main()
{
	// 传值传参
	A aa1;
	f1(aa1);
	cout << endl;
	// 传值返回
	f2();
	cout << endl;
	// 隐式类型,连续构造+拷贝构造->优化为直接构造
	f1(1);
	// 一个表达式中,连续构造+拷贝构造->优化为一个构造
	f1(A(2));
	cout << endl;
	// 一个表达式中,连续拷贝构造+拷贝构造->优化一个拷贝构造
	A aa2 = f2();
	cout << endl;
	// 一个表达式中,连续拷贝构造+赋值重载->无法优化
	aa1 = f2();
	cout << endl;
	return 0;
}

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

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

相关文章

昇腾芯片解析:华为自主研发的人工智能处理器全面分析

在当今科技发展的浪潮中&#xff0c;昇腾芯片作为一种新兴的处理器&#xff0c;正引起广泛的关注和讨论。升腾芯片究竟是由哪家公司生产的&#xff1f;这个问题一直困扰着许多人。下面小编将全面介绍、分析升腾芯片的生产商及各类参数、应用&#xff0c;以便读者对其有更全面的…

【C++】设计模式:建造者、原型、单例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍设计模式&#xff1a;建造者、原型、单例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

2024年泰迪智能科技合作伙伴战略大会暨产教融合实训基地落成仪式圆满结束

2024年泰迪智能科技合作伙伴战略大会 暨产教融合实训基地落成仪式 3月6日&#xff0c;2024年泰迪智能科技合作伙伴战略大会暨产教融合实训基地落成仪式在泰迪智能科技产教融合实训基地举行&#xff0c;本次合作伙伴战略大会围绕“龙腾山海&#xff0c;共赴新程 ”主题开展&…

小程序开发平台源码系统 功能强大 各种行业小程序开发功能 带完整的搭建教程

小程序开发平台源码系统旨在为用户提供一套高效、稳定、易用的开发工具&#xff0c;帮助用户快速搭建起自己的小程序平台。通过该系统&#xff0c;用户可以轻松实现小程序的定制开发&#xff0c;满足各种行业的需求。同时&#xff0c;还提供了丰富的功能和插件&#xff0c;帮助…

day37 贪心算法part6

738. 单调递增的数字 中等 提示 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 不知道怎么讲思路……以9287举例&#xff0c;…

【蓝桥杯】Excel地址

一.题目描述 二.问题分析 类似于进制转换 //Excel地址 #include <iostream> #include <stack> using namespace std;//const int N1e22; long long n; stack <char> s;int main(int argc, const char * argv[]) {ios::sync_with_stdio(0);cin.tie(0);cout.…

什么是工业边缘网关?工业边缘网关有什么作用?

在数字化和智能化的浪潮下&#xff0c;工业领域正迎来前所未有的变革。其中&#xff0c;工业边缘网关作为这场变革中的重要角色&#xff0c;正逐渐受到人们的关注。那么&#xff0c;什么是工业边缘网关&#xff1f;它如何在工业数字化中发挥作用&#xff1f;今天&#xff0c;就…

虾皮、lazada店铺运营攻略,如何搭建高效、稳定的自养号测评系统

随着电子商务的蓬勃发展&#xff0c;越来越多的人选择在虾皮这样的电商平台上开设店铺&#xff0c;以实现创业梦想。但如何在众多店铺中脱颖而出&#xff0c;成为消费者的首选?本文将为您详细解答“怎么样做好虾皮店铺”&#xff0c;并提供一些实用的运营建议。 一、怎么样做…

F1-score模型评估

什么是F1-score F1-score 是一种用于衡量分类模型性能的指标&#xff0c;它综合了精确度&#xff08;Precision&#xff09;和召回率&#xff08;Recall&#xff09;两个指标。F1-score 的值在 0 和 1 之间&#xff0c;值越接近 1&#xff0c;表示模型的性能越好。在文本分类任…

三八妇女节智慧花店/自动售花机远程视频智能监控解决方案

一、项目背景 国家统计局发布的2023年中国经济年报显示&#xff0c;全年社会消费品零售总额471495亿元&#xff0c;比上年增长7.2%。我国无人零售整体发展迅速&#xff0c;2014年市场规模约为17亿元。无人零售自助终端设备市场规模超过500亿元&#xff0c;年均复合增长率超50%。…

中科数安|防止公司电脑文件资料 \ 数据外泄

中科数安是一家提供企业信息安全解决方案的专业机构&#xff0c;针对防止公司电脑文件资料和数据外泄的问题&#xff0c;可能会提供如下类型的解决方案和服务&#xff1a; 1. **数据加密系统**&#xff1a;通过先进的透明加密技术&#xff0c;实现对公司电脑上的文件进行实时加…

京东获得JD商品详情 API 返回值说明|京东商品采集API接口接入

京东获得JD商品详情 API 返回值说明 item_get-获得JD商品详情 API测试 注册 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&…

测试一下 Anthropic 宣称超过 GPT-4 的 Claude 3 Opus

测试一下 Anthropic 宣称超过 GPT-4 的 Claude 3 Opus 0. 引言1. 测试 Claude 3 Opus 0. 引言 今天测试一下 Anthropic 发布的 Claude 3 Opus。 3月4日&#xff0c;Anthropic 宣布推出 Claude 3 型号系列&#xff0c;该系列在广泛的认知任务中树立了新的行业基准。该系列包括…

@大学生必看内容!QT创建C++项目,并使用Opencv进行图像处理!

一、创建C项目 二、向C项目部署opencv。详细步骤&#xff1a;查看地址。 避坑&#xff01;&#xff01;

如何判断螺栓已经拧紧?——SunTorque智能扭矩系统

智能扭矩系统-智能拧紧系统-扭矩自动控制系统-SunTorque 螺栓拧紧的标准并非仅仅依赖于螺栓的外观&#xff0c;而是依赖于几个关键因素&#xff0c;包括扭矩、预紧力和材料疲劳等。下面SunTorque智能扭矩系统和大家将详细讨论这些因素&#xff0c;并给出如何判断螺栓是否已经拧…

英语四级开始报名了?大学生如何三个月突破四级【文章底部添加进大学生就业交流群】

目录 一、明确考试内容与要求 二、制定合理的复习计划 三、注重听力和阅读能力的提升 四、加强词汇和语法的积累 五、多做真题和模拟题 英语四级考试&#xff0c;对于大多数大学生来说&#xff0c;是检验英语水平的一个重要标准。随着报名时间的来临&#xff0c;许多同学都…

设计模式(工厂模式)

设计模式&#xff08;工厂模式&#xff09; 一、工厂模式介绍 在工厂模式中&#xff0c;父类决定生成示例的方式&#xff0c;但不决定所要生成的具体的类&#xff0c;具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。 二、示例程序 以下示例程…

07 | 行锁功过:怎么减少行锁对性能的影响?

MySQL 的行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁&#xff0c;比如 MyISAM 引擎就不支持行锁。不支持行锁意味着并发控制只能使用表锁&#xff0c;对于这种引擎的表&#xff0c;同一张表上任何时刻只能有一个更新在执行&#xff0c;这就会影响到业务…

HTML静态网页成品作业(HTML+CSS)——电影网首页网页设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

Flink ExecuteGraph构建源码解析

文章目录 前言ExecutionGraph中的主要抽象概念源码核心代码入口源码核心流程&#xff1a; 前言 在JobGraph构建过程中分析了JobGraph的构建过程&#xff0c;本文分析ExecutionGraph的构建过程。JobManager(JobMaster) 根据 JobGraph 生成 ExecutionGraph。ExecutionGraph是JobG…