栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++友元函数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++友元函数

用friend修饰的函数

普通友元函数

~友元只是提供一个场所,赋予对象能够打破类的权限限定(无视权限)

~不是说可以忽视掉原来的规则,类中的数据成员必须通过对象去调用

~友元函数在一定程度上打破了类的封装性

小知识:

友元函数可以在类中声明,类中实现/类外实现

在类外实现友元函数需要注意:

~不需要类名限定

~不需要friend关键字

无参普通函数:在类中声明,在类中实现需要在最前面声明一下<--->未声明--->未定义的标识符

void printData();    //告诉编译器有这个函数,函数在类中的定义实现

友元函数不属于类,在类中实现不能直接访问数据

解决方案

--->在友元函数中构造的对象可以无视权限--->访问保护、私有属性

class Student
{
public:
	Student(string name, int age) :name(name), age(age) {}
	friend void printdata() {
	    Student gg("好朋友",29);    //在友元函数中构造一个对象
		cout < 

--->传参的方式

class Student
{
public:
	Student(string name, int age) :name(name), age(age) {}
	friend void printdata(Student&mm) {
	
		cout << mm.name << "t" << mm.age << endl;

	}
protected:
	string name;
	int age;
};


int main()
{
	Student mm("小明", 18);
	printdata(mm);

	return 0;
}


注意:普通函数和友元函数的区别

普通函数没法直接调用,需要类名限定,存在权限限定问题

友元函数不受权限限定,在外面可以直接调用

void printData(Student& mm)    
{
    cout< 
以另一个类的成员函数充当友元函数 

一个类的成员函数成为另一个类的友元函数,实现顺序如下:

  • B 类

  • A类

  • A类的友元函数(B类的成员函数)--->成员函数的实现一定是在另一个类(A类)的下面实现

比喻:有一个人,再来一个人,才能描述他们之间的关系

class B
{
public:
	
	void printA();
};

class A
{
public:
	friend void B::printA();     //把B类的成员函数充当A类的友元函数
protected:
	string name= "A";
};

void B::printA()
{
	A a;
	cout << a.name<< endl;
}
int main()
{
	
	
	B b;
	b.printA();
	return 0;
}

小知识:在B类中的其他函数<--->不是A类的友元函数,不能无视权限限定

class B{

    void printData();

};
void B::print(){        //B类的一个成员函数(未声明为A类的友元函数)

    A a;
	cout << a.name<< endl;    //报错,不能访问,没有  声明为A类/不是A类  的友元函数

}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604207.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号