这篇文章已经参与了“新人创作礼”活动,共同开辟了创作道路。

一、友元

宇元分为宇元函数和宇元类。

友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用指针式万用表

1.指针是什么友元函数

如果要使用co指针数组变量类型有哪些ut直接输出日期,而不是使用成员函数指针万用表间接输出,则必须执行重载。

Cout的类型为o变量的定义stream,调变量是什么意思用时将传递到cout。

代码变量是变量类型有哪些友元函数的声明和定义么意指针数组思?

Class Date

{

Public:

vohttp 302id operator(ostre成员变量和成员方法amout)//void operator(date * this,ostreamout)

{

out _ year ‘- ‘ _ month ‘- ‘ _ dayendl;

}

Private:

Int _ year友元函数是类的成员函数

In友元函数可以访问私有成员吗t _ month

Int _ day

}

但是,在重载时,由于第一个参数一定是隐含的this指针,使用重载时必须按如下指针方式使用:

代码如下:

Int main()

{

Date D1

D1 cout//即d 1 . operator(cout);

return 0;

}

这显然不符合指针式万用表cout的使用习惯,代码的可读成员变量有没有默认值性不好,不如间接的print函数。

有一个问题。如果在类内写入重载,成员变量会降低代码的可读性,写入类外部,并且无法访问类成员。

“_blank” r友元函数的作用el=”noopener”>变量。成员变量用于描述对象的特征

那么怎样解决这个问题呢——用友元http://192.168.1.1登录

友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不成员变量用于描述对象的特征属于任何类,但需要在类的内部声http 404明,声明时指针数组和数组指针的区别需要加friend关键字。成员变量和成员方法变量之间的关系

代码如下:指针万用表读数图解

class Date
{
	//定义友元函数(在类内)
	//只需在函数声明前加上friend即可
	friend void operator<<(ostream& out, const Date& d);
public:
	Date(int year = 1970, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
void operator<<(ostream& out, const Date& d)
{
	out << d._year << "-" << d._month << "-" << d._day << endl;
}
int main()
{
	Date d1;
	cout << d1;//即operator<<(cout, d1);
	return 0;
}

但是由于operator<<返回值是空,所以无法实现连续输出,只需将operator<<的返回变量的定指针式万用表值改为ostream&,即变量是什么意思继续返回out,这样每https和http的区别次输出后的变量是什么意思返回值都是out,可支持连续输出。

代码如下:

class Date
{
	friend ostream& operator<<(ostream& out, const Date& d);
public:
	Date(int year = 1970, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
private:
	int _year;
	int _month;
	int _day;
};
ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "-" << d._month << "-" << d._day << endl;
	return out;
}
int main()
{
	Date d1;
	Date d2(2021, 7, 21);
	cout << d1 << d2;//可连续输出
	return 0;
}

输入重载>>同理。

代码如下:

class Date
{
public:
	friend istream& operator>>(istream& in, Date& d);
private:
	int _year;
	int _month;
	int _day;
};
//cin类型为istream
//返回值为istream可支持连续输入多个Date对象
istream& operator>>(istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}

注意:

(1)友元函数可访问类的私有http://192.168.1.1登录和保护成员,但不是类的成员函数

(2)变量名友元函数不能用const修饰

(3)友元函数可以在类定义的任何地方声明,不受类访问限定指针c语言符限制

(4)一个函成员变量和静态变量的区别数可以是多个类的友元函数。

(5)友元函数的调用与普通函数的调用和原理相同。变量是什么意思


2指针.友元类

友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公成员变量和成员方法有成员。 如下面的代成员变量是什么意思码中Date类中的成员函数想要访问Time类型的对象_t的成员变量,则需要将Date类定义为Time类的友元。

代码如下:

class Date
{
public:
	Date(int year = 1970, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void SetTime()
	{
		_t._hour = 0;
		_t._minute = 1;
		_t._second = 1;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};
class Time
{
	friend class Date;
public:
	Time(int hour = 0, int minute = 1, int second = 1)
	{
		_hour = hour;
		_minute = minute;
		_second = second;
	}
private:
	int _hour;
	int _minute;
	int _second;
};

注意:

(1)友元关系是单向的,不具变量泵有交换性。 比如上述Time类和Date类,变量名的命名规则在Time类中声明Date类为其友元类,那么可以http 302在Date变量的定义类中直接访问Time 类的私有成员变量,但不能指针数组和数组指针的区别在Time类中访问Date类中私有的成员变量。

(2指针说漫友元关成员友元函数的作用变量系不能传指针万用表读数图解。 如果B是A的友元,C是B的友元,不能说明C是A变量的定义的友元。


二、C语言动态内存管理的方式

指针式万用表使指针c语言用方法于C语言动态内存管理的相关知识请移步C语言动态内存管理。


三、 C++内存管理方式成员变量用于描述对象的特征

通过ne成员变量和局部变量w和delete指针说漫操作符进行动态内存管理。成员变量

注意成员变量C语言中与动态内存相关的malloc,realloc,calloc和free是函数,而C++中的变量泵new指针数学和delete是操作符。

1.new/delete操作变量值内置类型

new友元函数是类的成员函数/delete和malloc/free针指针式万用表对内置类型没有任何差别,只是写法不一样变量泵

代码如下:

void Test()
{
	//注意new和delete的格式
	//动态申请一个int类型的空间,不初始化
	int* ptr1 = new int;
	//动态申请一个double类型的空间并初始化为3.14
	//注意可以直接初始化
	double* ptr2 = new double(3.14);
	//动态申请10个char类型的空间
	char* ptr3 = new char[3];
	delete ptr1;
	delete ptr2;
	delete[] ptr3;//不要忘记[]
}

注意:申请和释放单个元素的空间,使用new和delete操作符变量是什么意思申请和释放连续的空间,使用new[]和delete[]。 new和del变量值ete、new[]和delete[]一定要变量类型有哪些匹配,否则可能变量之间的关指针数组和数组指针的区别出问题。


2.ne成员变量和成员方法w和delete操作自定义类型

代码如下:

class ListNode
{
public:
	ListNode(int val = 0)
		:_val(val)
		, _prev(nullptr)
		, _next(nullptr)
	{
		cout << "调用构造函数" << endl;
	}
	~ListNode()
	{
		cout << "调用析构函数" << endl;
	}
private:
	int _val;
	ListNode* _prev;
	ListNode* _next;
};
int main()
{
	ListNode* c = (ListNode*)malloc(sizeof(ListNode));
	free(c);
	ListNode* cpp = new ListNode;
	delete cpp;
	return 0;
}

调试如下,可以观察到malloc仅仅开出所需的空间,并不会对指针指向地址的成员变量与函数变量进行初始化;而new不仅开出所需的空间,还会会对指针指向地址的成员变量进行初始化。

调试结果如下:

【C++】友元+内存管理


运行如下,可以观察到delete会调用自定义http 302类型的析构函数,而fre变量e不会。

运行如下:

【C++】友元+内存管理

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。


四、 malloc/free和n变量值ew/delete

1.共同点

从堆上申请空间,并且需要手动释放。


2.不同点

(1)malloc和free是变量与函数函数,new和delete是操作符

(2)malloc申请的空间不会初始化,new可以初始化

(3)malloc申请空成员变量和静态变量的区别间时,需要手动计算空间大小,new成员变量有没有默认值只需在其后跟上空间的类型即可

(4)malloc的返回值为void*指针数组和数组指针的区别, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

(5)malloc申请空间失败时,返回的是NUL指针数组L,因此使用时必须判空,new不需要,但是友元函数可以访问私有成员吗new需要捕获异常

(6)申请自定义类型对变量泵象时,malloc/free只会开辟空间,不会调用构造函数与析变量英语构函数,而new在申请空间 后会调用构造函数完成对变量泵象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理


感谢阅读,如有错误请批评指正

发表评论

提供最优质的资源集合

立即查看 了解详情