友元函数

C++面向对象-11-友元

我与影子孤独终老i 提交于 2020-01-30 13:50:01
这篇来学习一个新的知识点:友元。生活中你的家有客厅和卧室,客厅是所有客人都可以进去,但是卧室是私有的,在程序中,客厅就是public权限,卧室是private权限。但是,有一些特殊的,在程序中,有一些被定义成private的属性,也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。 友元的目的就是让一个函数或者类可以访问另一个类中私有成员,友元的关键字为friend 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 1.全局函数做友元 下面代码表示一个好基友来到你家,访问你的客厅,当然没有问题,客厅是public属性。 #include <iostream> #include <string> using namespace std; class Building { public: Building() //构造函数 { m_SittingRoom = "客厅"; m_BedRoom = "卧室"; } public: string m_SittingRoom;// 客厅 private: string m_BedRoom;// 卧室 }; //全局函数 void goodGay(Building *building) { cout << "好基友全局函数 正在访问:" << building->m_SittingRoom << endl; } void

C/C++对运算符重载详解

余生颓废 提交于 2020-01-14 12:27:12
下面来进行这段代码的分析: struct node { //定义一个结构体node(节点) int x; int y; int len; //node中有3个成员变量x,y,len bool operator <( const node &a) const { //重载<操作符。可以对两个node使用<操作符进行比较 return len<a.len; } }; 括号中的const表示参数a对象不会被修改,最后的const表明调用函数对象不会被修改! 想必看到这里对重载运算符算是有一丁点的了解吧,下面看些理论文字,更加清楚的了解关系! Return Top 重载运算符的介绍 C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。   运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) {

C++学习笔记5

三世轮回 提交于 2020-01-05 04:44:33
1.友元   1.定义为谁友元,就在谁的类中用关键字friend声明其要定义的友元。   2.一些函数不是类的一部分,但又频繁访问类的数据成员,此时可定义为友元函数,也可定义友元类。   3.友元只能发生在异类之间,同类之间无隐私。   4.作用:提高程序的运行效率,但破坏了类之间的封装和隐藏性,使得非成员函数可以访问类的私有成员   5.友元目的本质:不让其他不属于本类的成员,成为类的成员而具有本类成员的属性。   6.声明为谁的友元,就能通过其对象访问其私有成员【把a定义为b的友元,则可通过b的对象访问b的私有成员】   7.友元函数无this指针   8.注意事项:       1.友元关系不能被继承。       2.友元关系是单向的不具有交换性。【a是b的友元,b不是a的友元】       3.友元关系不具有传递性。【c是b的友元,b是a的友元,但c不是a的友元】 2.在定义友元函数时,用前向声明。   前向声明:是一种不完全声明,即只需提供类名(无需提供类实现)。但存在限制:       1.不能定义类的对象       2.可以用于定义指向这个类型的指针或引用       3.用于声明(不是定义)使用该类型,作为形参类型或函数返回类型。   友元函数的实现过程:     若将一个类(a)的函数声明为另一个类(b)的友元函数,则类a放在类b前面定义,且将类b进行前向声明

C++友元和内部类

孤街浪徒 提交于 2019-12-23 21:59:50
一、友元 1.1 友元分为:友元函数和友元类 友元提供了一种突破封装的方式,有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。 1.2 友元函数:友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。 说明: ① 友元函数可访问类的私有成员,但不是类的成员函数 ② 友元函数不能用const修饰 ③ 友元函数可以在类定义的任何地方声明,不受类访问限定符限制 ④ 一个函数可以是多个类的友元函数 ⑤ 友元函数的调用与普通函数的调用和原理相同 1.3 友元成员函数:friend函数不仅可以是一般函数(非成员函数),而且可以是另一个类中的成员函数。 注意:可能会用到类的提前引用声明。 #include <iostream> using namespace std; class Date; //对Date类的提前引用声明 class Time { public: Time(int hour, int minute, int second) :hour(hour) , minute(minute) , second(second) {} void display(Date& d); //引用Date类的对象 private: int hour; int minute; int second; };

C++中的类模板详细讲述

随声附和 提交于 2019-12-20 10:25:21
一、类模板定义及实例化 1 . 定义一个类模板: View Code 1 template<class 模板参数表>2 3 class 类名{4 5 // 类定义......6 7 }; 其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是 类型参数 ,也可以是 非类型参数。 类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。 例: View Code 1 template<class type,int width>2 3 //type为类型参数,width为非类型参数4 5 class Graphics; 注意: (1) 如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。 (2) 模板参数名不能被当作类模板定义中类成员的名字。 (3) 同一个模板参数名在模板参数表中只能出现一次。 (4) 在不同的类模板或声明中,模板参数名可以被重复使用。 View Code 1 typedef string type; 2 3 template<class type,int width> 4 5 class Graphics 6 7 { 8 9 type node;//node不是string类型10 11 typedef double type;//错误

友元

让人想犯罪 __ 提交于 2019-12-20 02:42:02
友元 c++控制对类私有部分的访问。 友元有3种。 友元函数 例子 A = 2.34 * B; 非成员函数不是由对象调用,它使用所有值都是显式参数。 Time operator*(double m, const Time & t); 但有时候非成员函数不可以调用成员数据。然而有一种特殊的非成员函数可以访问类的私有成员,他们被称为友元函数。 友元类 友元成员函数 通过让函数成为类的友元,可以赋予该函数与类的成员函数相同的访问权限。 创建友元函数 创建友元函数的第一步是将其原型放在类声明中,并在原型声明前加上关键字friend。 friend Time operator*(double m, const Time& t); 上述原型意味着一下两点。 operator*()函数是在类声明中声明的,但他不是成员函数,因此不能使用成员运算符来调用。 operator*()不是成员函数,但它与成员函数访问权限相同。 第二步是编写函数定义。 因为它不是成员函数,所以不要使用Time::限定符。另外不要再定义函数头使用friend。 当函数定义也是原型时,需要加friend关键字。 常用的友元 重载<<运算符 第一个重载版本 因为第一个操作数是ostream类对象cout,所以需要使用友元函数。 而且没有使用到ostream中的私有部分,所以只需要作为Time类的友元函数。 在类中声明friend

C++ 友元函数友元类

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-15 00:18:10
友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它 不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。 友元函数的调用与一般函数的调用方式和原理一致。 友元类 : 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。 当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类的友元类。定义友元类的语句格式如下: friend class 类名; 其中:friend和class是关键字,类名必须是程序中的一个已定义过的类。 以下语句说明类B是类A的友元类: class A { … public: friend class B; … }; 经过以上说明后,类B的所有成员函数都是类A的友元函数,能存取类A的私有成员和保护成员。 使用友元类时注意: (1) 友元关系不能被继承。 (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。 (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元

C++类或结构作为map的key值

心已入冬 提交于 2019-12-12 20:19:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1.只有重载<的类或者结构才能作为map的key值。 string可以作为key值是因为string重载了< 2.如果不重载<会提示如下错误: error C2676: 二进制“<”: “const C”不定义该运算符或到预定义运算符可接收的类型的转换 3.重载<但是没有实现会提示如下错误: Expression: invalid operator< 比如bool operator < (const C &c) const{return true;} #include < string > #include <map> using namespace std; // 重载<的类或结构才能作为map的key值 class C { public : int i; string str; bool operator < ( const C &c) const { return i < c.i; } }; void main() { map<C, int > mapC; C c0; c0.i = 0 ; c0.str = " str1 " ; mapC.insert(pair<C, int >(c0, 0 )); C c1; c1.i = 1 ; c1.str = " str2 " ; mapC.insert(pair

c++友元函数

妖精的绣舞 提交于 2019-12-11 02:26:44
多年前就粉c++,认为这是黑客专门用的语言,到现在这种情怀仍有增无减;那时朦朦胧胧的看到友元函数这个词顿时觉得深不可测;其实通过下面的例子我们不难发现,友元函数就是在类方法之外,通过函数访问类的私有成员的一种方法声明。不像人话是么?先看这样一个例子 定义了一个坐标点的类用于计算两点间的距离(参见解析几何之类的数学书),该类有两个属性x坐标,y坐标 #pragma once class mypoint { private: int x; int y; public: mypoint(); mypoint(int x, int y); int getx() { return this->x; } int gety() { return this->y; } ~mypoint(); }; 类方法的实现 #include "mypoint.h" mypoint::mypoint() { } mypoint::mypoint(int x, int y) { this->x = x; this->y = y; } mypoint::~mypoint() { } 在主程序文件中,突然想定义一个函数,通过获得两个点的(x,y)计算点之间的距离 #include<iostream> #include "mypoint.h" #include "math.h" using namespace std;

友元

穿精又带淫゛_ 提交于 2019-12-09 23:59:55
友元 写在前面   类的主要特点之一就是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有数据成员,怎么办呢?   解决办法是使用友元函数,友元函数时一种特权函数c,C++允许这个特权函数访问私有成员。这一点我们可以用生活中的例子来看:   比如你的家有客厅,有卧室,客厅是public的,所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是,你可以允许你的好朋友进去。   进程员可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。 1.全局函数做友元函数 友元语法 friend 关键字只出现在声明处 其他类、类成员函数、全局函数都可以声明为友元 友元函数不是类的成员,不带this指针 #include <iostream> #include<string> using namespace std; class Home { public: friend void test(Home *home); Home() { this->bedroom = "卧室"; this->sittingroom = "客厅"; } string sittingroom;//客厅 private: string bedroom;//卧室 }; void test(Home *home) { cout << "你的好友正在访问"