友元函数

认识C++友元函数

允我心安 提交于 2020-02-11 22:35:57
C++友元函数 今天学到一个特别有意思的东西,甚至是C++独有的东西,叫做 友元函数 。类的友元函数是定义在类外部,但有权访问类的所有 私有(private) 成员和 保护(protected) 成员。尽管友元函数的原型有在类的定义中出现过, 但是友元函数并不是成员函数。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。 如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend 。C++之所以 特有 友元函数,其实是别的面向对象语言换了个方法叫他,而不是说C++有这样一个新鲜的特性。可以对应到Java的private-package,C#的Internal等。 下面看例子: 如果我有这样一个类 class Pen{ public: Pen(); private: int price = 1500; }; 我在主函数中 int main(){ Pen pilot; cout << pilot.price << endl; } // 编译器会果断报错,因为没有权限访问Pen类的私有成员 那么如果有了今天的主角友元函数 class Pen{ public: Pen(); private: int price = 1500; friend void printPrice(Pen pilot);

Computer.h [友元] C++ 类

左心房为你撑大大i 提交于 2020-02-11 06:39:39
#pragma once #include #include <stdlib.h> #include using namespace std; //#include “ComputerService.h”//使用类的成员函数作为友元函数,必须包含其头文件 class Computer { public: string getcpu() { return cpu; } private: string cpu = “i5”; void friend upgrade(Computer* computer);//全局函数作为友元函数 //friend void ComputerService::upgrade1(Computer* computer);//类的成员函数作为友元函数 friend class ComputerService;//友元类 }; 来源: CSDN 作者: qq_44699909 链接: https://blog.csdn.net/qq_44699909/article/details/104219677

C++笔记13

人走茶凉 提交于 2020-02-10 11:43:43
友元 友元分为友元函数和友元类 1.友元函数 一个类的友元函数可以访问该类的私有成员,友元函数不是这个类成员函数。 这个友元函数可以是一个很普通的全局函数,这个类把这个函数声明为友元以后,这个函数就可以访问这个类的私有成员了 exp. class CCar;//提前声明CCar类,以便后面的CDriver类的使用 class CDriver { public: void ModifyCar(CCar * pCar);//改装汽车 如果是变量的话,应该在开头把CCar写完整 }; class CCar { private: int price; friend int MostExpensiveCar(CCar cars[],int total);//声明友元 friend void CDriver::ModifyCar(CCar * pCar);//声明友元 }; void CDriver::ModifyCar(CCar * pCar) { pCar->price+=1000;//汽车改装后价值增加 } int MostExpensiveCar( CCar cars[],int total)//求最贵车价 { int tmpMax=-1; for(int i=0;i<total;++i) if(cars[i].price>tmpMax) tmpMax=cars[i].price;

C++友元函数与友元类

China☆狼群 提交于 2020-02-09 17:01:39
一、友元概述 举个现实中的例子,一般家庭都有客厅和卧室,我们将客厅比喻为公用部分(public),卧室比喻成私有部分(private),在类外只能访问公用成员,只有本类的函数才可以访问私有成员,我们可以把友元(friend)当做朋友,一般家庭会这么做,客厅(public)对所有来客开放,而卧室除了本家庭成员(private)可以进入之外,还允许朋友进入。 在C++中,友元可以访问与其有好友关系的类中的私有成员,友元包括友元函数和友元类。 二、友元函数 如果在本类以外的其他地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数),在类体中用friend对其进行声明,此函数就称为类的友元函数。友元函数可以访问类中的私有成员。 · 1.将普通函数声明为友元函数 #include<iostream> using namespace std; class Time{ public: Time(int,int,int); friend void display(Time &); private: int hour; int minute; int sec; }; Time::Time(int h,int m,int s){ hour=h; minute=m; sec=s; }; void display(Time &t){ cout<<t.hour<<":"<<t

友元函数

孤街浪徒 提交于 2020-02-08 19:47:57
类中私有属性不可以被类外部操作,如果要操作,可以用友元函数。 class A { public: A(int x,int y) //构造函数,为成员变量赋值 { this->m_x=x; this->m_y=y; } int getA() //获取m_x的值 { return this->m_x; } friend void modifyA(A* pA,int x); //友元函数,与实现函数的形式要完全一致 private: int m_x;//私有属性 int m_y; }; void modifyA(A* pA,int x) //全局函数,修改类A的私有属性m_x的值 { pA->m_x=x; } int main() { A a(1,2); //类的实例化对象 cout << a.getA()<< endl; modifyA(&a,100); //1被改为100 cout<<a.getA()<<endl; return 0; } 来源: https://www.cnblogs.com/xixixing/p/12284360.html

C++ 模板何时被实例化

匆匆过客 提交于 2020-02-06 05:30:07
今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后续查错,发现是自己忘记写结束符号了。 这就引出我知识点的不足了——之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化? 整理和理解网上资料后获得如下总结: 1. 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。   1.1声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义 。   1.2 定义一个类类型的对象时需要该类的定义,因此类模板会被实例化 。   1.3 在使用sizeof()时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化 .   1.4 new表达式要求类模板被实例化。   1.5 引用类模板的成员会导致类模板被编译器实例化。   1.6 需要注意的是,类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。 用来实例化成员函数的类型,就是其成员函数要调用的那个类对象的类型 总结1很好的解释了为啥我的程序在调用特定的成员函数时才会报错。 不过上面的介绍还是比较笼统,还有很多的细节点需要注意到,从网上转载如下:转载链接

C++中的友元

断了今生、忘了曾经 提交于 2020-02-06 00:57:23
文章目录 1 C++中的友元 1.1 友元的概念 1.2 友元的用法 1.3 友元的注意事项 1.4 友元的尴尬 1 C++中的友元 1.1 友元的概念 什么是友元: 友元是C++中的一种关系。 友元关系发生在函数与类之间或者类与类之间。 友元关系是单项的,不能传递。 1.2 友元的用法 用法如下: 在类中以friend关键字声明友元。 类的友元可以是其它类或者具体函数。 友元不是类的一部分。 友元不受类中访问级别的限制。 友元可以直接访问具体类的所有成员。 友元的语法: 在类中用friend关键字对函数或类进行声明。 友元使用示例: # include <stdio.h> # include <math.h> class Point { double x ; double y ; public : Point ( double x , double y ) { this -> x = x ; this -> y = y ; } double getX ( ) { return x ; } double getY ( ) { return y ; } friend double func ( Point & p1 , Point & p2 ) ; } ; double func ( Point & p1 , Point & p2 ) { double ret = 0 ; ret =

C++运算符重载

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-05 05:25:41
1、什么是运算符重载? (1)运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的 数据类型 。 因为在实际中确实有这种需求,例如将两个类对象直接相加,直接比较两个类对象的大小.....等等,因为普通的运算符 不能完成这种功能,所以在适当的时候对运算符进行重载,能够给我们的编程带来很大的方便。 (2)运算符函数定义的一般格式: <返回类型说明符> operator<运算符符号>(<参数表>) { <函数体> } 2、运算符重载的分类:一元运算符重载、二元运算符重载 一元运算符表示的是这中运算符只需要一个数参与运算,而二元运算符表示这种运算符需要两个数参与运算;例如:两个是相加的 "+"运算,就是一个二元运算符,两个数相乘的 "*" 运算符也是一个二元运算符;而 "++" "--",还有作为取反的负号运算符 "-" 等等都是一元运算符。 (1)一元运算符重载,本例子中使用 "-" 和 "++"运算符来演示一元运算符重载的使用," ++"运算符的两种重载方式:前置++、后置++ 按照运算符重载的方式来说,一般分为友元函数重载和成员函数重载两种方式,下面分别用代码进行说明: 1 #include <iostream> 2 using namespace std; 3 4 class Coordinate{ // 定义一个坐标类 5 public: 6

友元函数及友元类详解

一个人想着一个人 提交于 2020-02-03 10:58:18
在 C++ 中,一个类中可以有 public、protected、private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员。现在,我们来介绍一种例外情况——友元(friend)。借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。 友元函数 在当前类以外定义的、不属于当前类的函数也可以在类中声明,但要在前面加 friend 关键字,这样就构成了友元函数。 友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数,友元函数可以访问当前类中的所有成员,包括 public、protected、private 属性的。 。 1) 将非成员函数声明为友元函数 # include <iostream> using namespace std ; class Student { public : Student ( char * name , int age , float score ) ; public : friend void show ( Student * pstu ) ; //将show()声明为友元函数 private : char * m_name ; int m_age ; float m_score ; } ; Student : :

类的友元

喜夏-厌秋 提交于 2020-02-02 05:20:56
一、介绍 属性变量是private类型,在类的外部是不能直接用 对象.属性 的方式访问的。 友元关系:一个类主动声明自己的朋友类、朋友函数,特许他们访问本类的数据。于是, 在友元函数中可以直接用对象.属性的方式访问 。它 适用于外界同时需要多个对象的私有属性 ,比如,求两点间距,而两点各为一个对象。 ( static静态变量 是同一个类的多个对象共享属于类而不属于任何对象的一个公共变量,要区分开,详情见 https://blog.csdn.net/floracuu/article/details/78106274 ) (实际上在类的外部写一个函数,接收形参为对象,在类中用一个成员函数将所需的属性值return出来即可。不过关于友元的讨论是基于想要直接用对象.属性的方式讨论的,所以以下的分析暂时忽略这种方式。这样看来,友元似乎不是必不可少的,希望自己可以早日真香,再来补充) 例: class Point { } ; 是一个二维坐标点的类,求两点间距,两个点各为一个对象,若求长度的函数写在类中,只能拿到本对象的坐标值,而不能拿到另一个点的值。写在外面,则两个点的坐标值都拿不到。所以要将计算距离的函数写在类的外面并且声明此函数为Point类的友元函数。 二、语法格式 1. 友元函数: 可以是普通函数,也可以是其他类的成员函数 声明,定义的方法是没有变化的,正常方式写就好,只是 需要在