189 8069 5689

第四层:友元与函数成员别样定义-创新互联

文章目录
  • 前情回顾
  • 友元
    • 友元的概念
    • 友元的目的
    • 友元的关键字
    • 友元的两种种用法
      • 全局函数做友元
      • 类做友元
  • 函数成员的别样定义
  • 有缘人学友元,急速突破第四层
  • 本章知识点(图片形式)

网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于企业网站设计,高端网页制作,对酒店设计等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业seo优化优化,H5建站,响应式网站。

🎉welcome🎉
✒️博主介绍:一名大一的智能制造专业学生,在学习C/C++的路上会越走越远,后面不定期更新有关C/C++语法,数据结构,算法,Linux,ue5使用,制作游戏的心得,和大家一起共同成长。
✈️C++专栏:C++爬塔日记
😘博客制作不易,👍点赞+⭐收藏+➕关注

前情回顾

上回到,在进入第三层后,我学习了隐藏在编译器内的一种神秘力量——this指针,this指针可以让编译器分清是哪个对象在调用类内的成员函数,同时,随着层数的增高,我对C++的理解越来越深,也越来越发觉C++的恐怖…

  • 🚄上章地址:第三层:C++对象模型和this指针
友元

“上到这里来,你也是一个有缘人了,老夫看你有大机缘在身,这层内容不难,友元,有缘人祝你好运,哈哈哈哈哈…”这道声音在我踏入到第四层的那一刻响起,“有缘,友元吗?”我小声嘀咕着,看向了面前的石碑上。

友元的概念

在生活中,每个人都有一些可以让大众知道并且访问的,比如名字,也有一些是不想让大众访问的,比如手机、汽车这些私密物品,但是如果经过本人同意,该人的好朋友就可以对私密物品进行访问,同样,在C++中,也有私有属性(private),可以让类外一些特殊的函数或者类进行访问,而这些特殊的函数或者类就需要用到友元。

友元的目的
  • 友元的目的就是让一个函数或者类访问另一个类内的私有成员
友元的关键字
  • 友元的关键字是friend,也就是中文的朋友。
友元的两种种用法
  1. 全局函数做友元
  2. 类做友元
全局函数做友元

当程序员想让全局函数访问一个类内的私有属性时,只需要将函数声明在类内的最上方,并且在函数发返回类型之前加上友元的关键字friend

#include#includeusing namespace std;

class person
{friend void test1();
public:
	person()
	{_name = "张三";
		_car = "奥迪A8";
		_phone = "iphone 100 por max";
	}
	string _name;
private:
	string _car;
	string _phone;
};

void test1()
{person p1;
	cout<< "现在在访问:"<< p1._name<< endl;
	cout<< "现在在访问:"<< p1._name<< "的"<< p1._car<< endl;
	cout<< "现在在访问:"<< p1._name<< "的"<< p1._phone<< endl;
}
int main()
{test1();
	return 0;
}

在这里插入图片描述
那这里可能会有人有疑问,是不是直接在类内声明就可以,不加前面friend是不是也可以访问?实验一下:

#include#includeusing namespace std;

class person
{void test1();
public:
	person()
	{_name = "张三";
		_car = "奥迪A8";
		_phone = "iphone 100 por max";
	}
	string _name;
private:
	string _car;
	string _phone;
};

void test1()
{person p1;
	cout<< "现在在访问:"<< p1._name<< endl;
	cout<< "现在在访问:"<< p1._name<< "的"<< p1._car<< endl;
	cout<< "现在在访问:"<< p1._name<< "的"<< p1._phone<< endl;
}
int main()
{test1();
	return 0;
}

在这里插入图片描述
可以看到报错是不可访问,所以证明,不仅仅需要在类内声明函数还需要加上关键字friend。

类做友元

类做友元,通过表面意思得知,是让一个类做另一个类的友元,然后可以用友元这个类访问把它当作友元的这个类,要注意的来了:

  1. 要访问的话,需要让当作友元这个类成为友元类内的一个对象成员,这个对象成员
    好是个指针,在创建对象时,利用new操作符申请一块对象成员大小的空间让指针指向
  2. 注意,因为使用了new操作符,在程序快要结束的时候,记得使用delete释放空间,并且对指针进行置空,以免造成野指针
#include#includeusing namespace std;

class person1;

class person
{friend class person1;
public:
	person()
	{_name = "张三";
		_car = "奥迪A8";
		_phone = "iphone 100 por max";
	}
	string _name;
private:
	string _car;
	string _phone;
};
class person1
{public:
	void test()
	{cout<< "现在访问的是:"<< p->_name<< endl;
		cout<< "现在访问的是:"<< p->_name<< "的"<<  p->_car<< endl;;
		cout<< "现在访问的是:"<< p->_name<< "的"<< p->_phone<< endl;;
	}
	person *p;
};
void test1()
{person1 pp1;
	pp1.p = new person;
	pp1.test();
	delete pp1.p;
	pp1.p = NULL;
}
int main()
{test1();
	return 0;
}

在这里插入图片描述

函数成员的别样定义

函数成员其实也可以在类外进行定义,是什么意思呢?其实就是将函数成员在类内进行声明,在类外进行定义,定义时同样要让编译器知道是类内成员,所以也要在函数名前加类名::类外声明写法是

返回值 类名::函数名 ();
当时构造函数时
类名::类名 ();

可以进行验证:

#include#includeusing namespace std;

//class person1;
//
class person
{public:
	person();
	void test1();
	string _name;
	string _car;
	string _phone;
};

person::person()
{_name = "张三";
	_car = "奥迪A8";
	_phone = "iphone 100 por max";
}
void person::test1()
{cout<< "现在访问的是:"<< _name<< endl;
	cout<< "现在访问的是:"<< _name<< "的"<< _car<< endl;
	cout<< "现在访问的是:"<< _name<< "的"<< _phone<< endl;
	
}

int main()
{person p1;
	p1.test1();
	return 0;
}

在这里插入图片描述
可以看到时正常运行的。

有缘人学友元,急速突破第四层

巨大石碑轰然倒塌,一阵烟土飘起,散去之后,只见一个身影向第五层走去…

本章知识点(图片形式)

在这里插入图片描述

😘预知后事如何,关注新专栏,和我一起征服C++这座巨塔
🚀专栏:C++爬塔日记
🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站题目:第四层:友元与函数成员别样定义-创新互联
文章地址:http://jkwzsj.com/article/ejgig.html

其他资讯