精华内容
下载资源
问答
  • 友元函数既可以是不属于任何类的非成员函数(全局函数),也可以是另一个类的成员函数(友元化时函数名前要加上所属的类),本文主要讨论一个类的成员函数如何成为另一个类的友元函数 具体实现 # include <...

    C++:成员友元函数(成员函数友元化)

    友元函数

    友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数。类授予它的友元特别的访问权。

    友元函数既可以是不属于任何类的非成员函数(全局函数),也可以是另一个类的成员函数(友元化时函数名前要加上所属的类),本文主要讨论一个类的成员函数如何成为另一个类的友元函数

    具体实现

    # include <iostream>
    # include <string>
    using namespace std;
    
    class Student;//对Student类的提前引用声明
    class Teacher 
    {
    private:
    	int num;
    	string name;
    	string sex;
    public:
    	Teacher(int n, string na, string s) { num = n; name = na; sex = s; }
    	//如果之前没有对对Student类做提前引用声明,底下就会报错无法识别Student类
    	void transform(Student& b);
    	Teacher(){};
    	void  display()
    	{
    		cout << "TEACHER:" << endl;
    		cout << num << endl;
    		cout << name << endl;
    		cout << sex << endl;
    	}
    };
    
    class Student
    {
    public:
    	Student(int n, string na, string s):num(n), name(na), sex(s) {};
    	void display()
    	{
    		cout << "student:" << endl;
    		cout << num << endl;
    		cout << name << endl;
    		cout << sex << endl;
    	}
    	friend void Teacher::transform(Student& b);
    private:
    	int num;
    	string name;
    	string sex;
    };
    //transform函数的具体定义一定要写在Student类完整定义之后,否则函数中对类中成员的使用会报错
    void Teacher::transform(Student& b)
    {   
    		num=b.num;
    		name=b.name;
    		sex=b.sex;
    }
    
    int main()
    {
    	Student t(12, "玛奇玛", "女");
    	t.display();
    	Teacher s;
        s.transform(t);
    	cout<<"转换后:"<<endl;
    	s.display();
    	return 0;
    }
    

    运行结果:
    运行结果

    说明

    提前引用声明注意事项

    我们知道C++的类应当是先定义,然后使用。但在处理相对复杂的问题、考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖。(列如头文件互引)

    这里类Teacher的公有成员函数transform的形参是类Student的对象,同时类Student的友元函数也属于Teacher类。由于在使用一个类之前,必须首先定义该类,因此无论将哪一个类的定义放在前面,都会引起编译错误。结局这个问题的方法,就是使用前向引用声明。前向引用声明,是在引用未定义的类之前,将该类的名字告诉编译器,编译器知道那是一个类名。这样,当程序中使用这个类名时,编译器就不会认为是错误,而类的完整定义可以在程序的其他地方。在上述程序加上下面的前向引用声明,问题就解决了。

    使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明, 但是在提供一个完整的类定义之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象(及类中的成员),上述案例中就是在Student类完整定义之后再定义Teacher类的成员函数transform,另一个案例如下

    class Fred;    //前向引用声明
    class Barney
    {
        Fred x;    //错误:类Fred的声明尚不完善
    };
    class Fred
    {
        Barney y;
    };
    

    编译出错的原因是对此类Fred的前向引用声明只能说明Fred是一个类名,而不能给出该类的完整定义,因此在类Barney中不能定义或使用类Fred的数据成员。

    应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。

    C++的类可以进行前向声明。但是,仅仅进行前向声明而没有定义的类是不完整的,这样的类, 只能用于定义指针、引用、以及用于函数形参的指针和引用。
    而不能定义对象(因为此时编译器只知道这是个类,还不知道这个类的大小有多大),也不能访问类的对象,任何形式的访问都不允许(因为此时根本不知道有些什么成员)。等到类正式定义以后,就可以以各种方式使用该类了。

    参考:
    https://blog.csdn.net/weixin_30604651/article/details/98868240
    https://blog.csdn.net/weixin_30800807/article/details/95889531

    展开全文
  • 今天在程序时用到了好多静态成员函数,然后突然想到了友元函数,有些思考。 首先,两者都可以读写对象的成员变量。基于此可以认为静态函数和友元函数都具有访问类内部数据的权限。静态函数毫无疑问具有类作用域,...

    C++笔记--关于友元函数和静态成员函数


    今天在写程序时用到了好多静态成员函数,然后突然想到了友元函数,有些思考。

    首先,两者都可以读写对象的成员变量。基于此可以认为静态函数和友元函数都具有访问类内部数据的权限。静态函数毫无疑问具有类作用域,而友元函数本身可能是全局函数、也可能是其他类的成员函数,所以我猜测是不是可以理解为静态函数是友元函数的一种特例。

    接下来,我想验证友元函数是否也可以具有类作用域,所以我打算在类内部定义一个友元函数。

    接着,我百度到了这篇文章:
    https://blog.csdn.net/weixin_34260991/article/details/93819698

    他在类内部定义了两个友元函数,一个无参数、一个以此类对象为参数。结果,调用无参的函数不能通过编译,以此类对象为参数的函数可以通过编译,并且可以正常运行。

    我认为,因为这两个函数定义在类内部,因此不具有全局作用域,编译器在调用函数这一行会自动检索当前作用域下是否有这个函数的声明,两个函数都没有,但是有参数的那个函数,有一个·类对象作为参数,编译器据此到类内部去检查是否有这个函数的声明,然后它成功找到了。

    所以,他一个函数能通过编译,一个不能通过编译的原因就在于编译器是否找到了函数声明。也就是说,这是一个函数作用域的问题。

    我首先尝试以调用静态函数的写法来调用无参函数,结果编译失败。然后我在全局作用域声明此无参函数,然后在main函数中调用,通过编译,并可正常运行。

    #include <iostream>
    using namespace std;
    
    class T
    {
    public:
    	T(){}
    	~T(){}
    
    	//不引入类对象
    	friend void show_hello_no_param()
    	{
    		cout << "show_hello_no_param() of T : Hello world!\n";
    	}
    
    private:
    	//引入类对象
    	friend void show_hello(T t)
    	{
    		cout << "show_hello() of T : Hello world!\n";
    	}
    
    };
    
    void show_hello_no_param();
    
    int main()
    {
    	T t;
    
    	show_hello_no_param();      //编译通过
    
    	T::show_hello_no_param();   //编译不能通过
    
    	show_hello(t);              //编译可以通过
    
    	getchar();
    
    	return 0;
    }
    
    

    虽说问题解决了,但是对于编译器可以根据函数参数到对应类型作用域内查找函数声明的这种按图索骥的能力表示赞叹!(我没有验证以此类型的对象为返回值是否可以,我认为不可以)

    最后,关于我的猜想(友元函数是否也可以具有类作用域)。我认为不可以。

    展开全文
  • 1.友元函数调用类成员变量要先定义类对象,然后通过对象调用,并且可以访问任何成员,成员函数就不需要定义类对象,可以直接使用数据成员, 2.友元函数成员函数的定义方式不同,友元函数有个friend修饰 3.定义...

    1.友元函数调用类成员变量要先定义类对象,然后通过对象调用,并且可以访问任何成员,成员函数就不需要定义类对象,可以直接使用数据成员,

    2.友元函数和成员函数的定义方式不同,友元函数有个friend修饰

    3.定义友元函数,不需要加类名

    4.调用友元函数不需要通过,类对象

     

     

    展开全文
  • 当运算符重载函数作为成员函数实现:最左边的操作数必须是运算符的一个类对象或者是对该类对象的一个引用。...当运算符重载函数作为友元函数实现:当访问类的private或protected数据成员时必须指定为友元函数。 ...

    当运算符重载函数作为成员函数实现:最左边的操作数必须是运算符的一个类对象或者是对该类对象的一个引用。函数的参数比原来的操作数个数少一个(后置的++、--除外,需要一个int形参),因为第一个操作数会被作为函数调用的目的对象,因此无需出现在参数表中,函数题可以直接访问第一个操作数的成员。
    在这里插入图片描述
    在这里插入图片描述

    当运算符重载函数作为友元函数实现:当访问类的private或protected数据成员时必须指定为友元函数。参数个数与原操作数个数相同,运算符的所有操作数必须显示通过参数传递。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 友元 一般来说,类的公有成员能够在类外访问,私有的成员只能被类的其他成员函数...C++提供一种允许外部类和函数存取类的私有成员和保护成员的辅助方法,即将它们声明一个给定类的友元(或友元函数),使其具有类成
  • 1)友元函数是个函数,只要让普通函数func声明类A的友元函数,那么func这个函数就能访问类A的所有成员(成员变量、成员函数),无论是public,private,protected 2)由于友元函数不属于类成员,所以友元函数的...
  • 最近开始看《Effective C++》,为了方便以后回顾,特意做了笔记。若本人对书中的知识点理解有误的话,望请指正!!! 假设用一个 class 来表示网页浏览器,这样... //把调用上述的三个函数的操作封装到一个函数内 void
  • 友元函数3. 友元类4. 友元成员函数 1. 前言 友元,一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend。贴一下百度百科的解释百度百科-友元...
  • 一、友元函数友元函数是一种特殊的函数,它需要在类体内进行说明,可以访问类的私有成员和保护成员,但又不是类的成员函数友元函数的说明如下:friend 数据类型函数名(参数)其中,friend是说明友元函数的关键字,...
  • //-- 声明类B是类A的友元类,则B可以访问类A的所有成员了。 friend class B; private: //public: int data; }; class B { public: void callBAF(int i, A& a){ a.data = i; std::cout << "a.data...
  • 与运算符重载为成员函数时不同的是,重载的友元函数不属于任何类,运算符的操作数都需要通过函数的形参表传递。操作数在形参表中从左到右出现的顺序就是用运算符表达式时操作数的顺序。 这里也分双目运算符和单目...
  • 一、友元介绍我们知道,类的成员函数可以访问同类的...友元函数友元类二、友元函数友元函数在类作用域外定义,但它需要在类体中进行说明为了与该类的成员函数加以区别,定义的方式是在类中用关键字friend说明该函数...
  • 重载操作符重载,使得程序表达更加直观,符合自然语言。对于双目运算符,建议...双目运算符=只能重载为成员函数;单目运算符()、[]、->只能重载为成员函数。第一个操作数只能ostream类型,所以运算符也只能友员。
  • 在C++中,我们使用类对数据进行了隐藏和封装,类的数据成员一般都定义私有成员,成员函数一般都定义公有的,以此提供类与外界的通讯接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地...
  • 借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。friend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些。我们会对好朋友敞开心扉,倾诉自己的...
  • 私有成员对于类外部的所有程序部分而言都是隐藏的,访问它们需要调用一个公共成员函数,但有时也可能会需要创建该规则的一项例外。友元函数是一个不属于类成员的函数,但它可以访问该类的私有成员。换句话说,友元...
  • 有时候有一个外部函数就是需要访问,为了解决这个问题,c++开了个后门,就是友元函数友元函数就是将外部函数在类中进行申明,声明时前面添加friend关键字,将其声明类的友元函数后就可以任意访问类中成员。...
  • 友元函数和友元类

    2021-05-26 22:40:49
    1.友元函数可访问类的私有和保护成员,但不是类的成员函数 2.友元函数不能用const修饰 3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制 4.一个函数可以是多个类的友元函数 在类的定义中用friend声明了...
  • 继承的是:接口 + 缺省实现 (default implementation)非虚成员函数 =>继承的是:接口 + 强制实现 (mandatory implementation)2) 不要重新定义一个继承自基类的非虚函数(never redefinean inherited ...
  • 左移运算符不能重载成员函数,而只能重载为友元函数。1.左移运算符成员函数达不到我们的效果2.如果使用友元函数 1.首先我们通过operator+加号运算符来了解成员函数友元函数的区别。 首先我们来看一下operator+加号...
  • C++友元函数的定义和使用 <C++析构函数C++友元类> 类的封装性实现了数据隐藏,即类的私有成员在该类的作用域之外是不可见的。但有时可能需要在类的外部访问类的私有成员,为此 C++ 提供了一种允许类外的函数...
  • 1.静态成员的使用 代码: #include<iostream> using namespace std; class Time { public: static int totalTime; Time(int a,int b,int c); void ShowTime() { cout<<"hour:"<<hour<<...
  • 成员函数前加static,该函数称为静态成员函数 static int getCount() { return _count; } 代码示例 class A { public: static int getCount() { return _count; } private: static int _count; }; /...
  • 私有成员只能在类的成员函数内部访问,如果想在别处访问对象的私有成员,只能通过类提供的接口(成员函数)间接地进行。这固然能够带来数据隐藏的好处,利于将来程序的扩充,但也会增加程序书写的麻烦。C++是从结构化...
  • C++程序:友元函数重载复数减法在dev-C++ 5.11下运行没有问题,但是在vc6.0运行时提示错误。 (自考C++程序设计2019年版,程序4-1,例4-2、程序4-2等有同样问题) 程序代码如下: #程序4-1 #include <iostream>...
  • c++友元类和友元函数

    2021-05-06 16:10:28
    友元函数不属于类的成员函数,但是友元函数必须在类内部定义; 友元函数使用friend关键词声明; 友元函数能够实现类之间的数据共享,较少系统开销,提高效率,但是会破坏类的封装机制; class FriendFunc { public:...
  • 友元 1.1什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。 具体来说:为了使其他类的成员...
  • C++ 友元函数

    2021-01-06 21:13:17
    友元函数是在类中用关键字friend修饰的非成员函数友元函数可以是一个普通的函数,也可以是其他类的成员函数,虽然它不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。 #include <...
  • 友元函数的使用方式

    2021-04-07 19:58:15
    一、介绍 个人认为该函数的作用及时能够是: 非成员函数可以使用 私有的 成员变量 用途: 便于 sort函数 和 优先...借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,879
精华内容 15,951
关键字:

友元函数写为成员函数