友元函数

C++中友元

荒凉一梦 提交于 2020-03-30 21:03:13
转载自: http://blog.chinaunix.net/uid-790245-id-2037327.html 问题提出:   我们已知道类具备封装和信息隐 藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开 销,而影响程式的运行效率。   为了解决上述问题,提出一种使用友元的方案。友元是一种定义在类外部的普通函数,但他需要在类体内进行说 明,为了和该类的成员函数加以区别,在说明时前面加以关键字friend。友元不是成员函数,但是他能够访问类中的私有成员。友元的作用在于提高程式的运 行效率,但是,他破坏了类的封装性和隐藏性,使得非成员函数能够访问类的私有成员。   友元能够是个函数,该函数被称为友元函数;友元也能够是个类,该类被称为友元类。 友元函数:   友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,他和普通函数相同,即在定义上和调用上和普通函数相同。下面举一例子说明友元函数的应用。 1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4

C++友元

做~自己de王妃 提交于 2020-03-30 17:10:07
友元是C++提供的一种破坏数据隐蔽和封装的机制 1.友元函数 友元函数是在类中使用关键字friend修饰的非成员函数 1.1友元普通函数 定义与概念 友元函数是一个普通的函数 友元普通函数在实现时,不需要类名的限定;在调用时,也不需要由实例来调用 示例代码 #include <iostream> #include <cmath> using namespace std; class Point{ public: Point(int x = 0,int y = 0):x(x),y(y){} int getX(){ return x;}//内联函数 int getY(){ return y;} void showData(); friend float dist(Point &p1,Point &p2);//声明友元函数 private: int x,y; }; //普通成员函数的实现,需要类名限定 void Point::showData(){ cout << "x: " << x << ", y: " << y << endl; } //因为友元函数是非成员函数,所以不需要类名限制 float dist(Point &p1,Point &p2){ double x = p1.x - p2.x; double y = p1.y - p2.y; return static_cast

C++ 关键字——friend

▼魔方 西西 提交于 2020-03-30 17:07:19
友元是指: 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界 间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分(注意友元函数不是类的一部分),但又需要频繁地 访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。 class Data{ public: ... friend int set(int &m);//友元函数friend class peop; //友元类 ... } 友元分为友元函数和友元类,两种具有不同的调用形式: A友元函数: 友元函数是可以直接访问类的私有成员的非成员函数。它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以 声明,声明时只需在友元的名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 1.友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数。 2.一个函数可以是多个类的友元函数,只需要在各个类中分别声明。友元函数的调用与一般函数的调用方式和原理一致。 B友元类

C++ 友元

亡梦爱人 提交于 2020-03-21 17:00:48
为什么使用友元? 例如:求两点之间的距离 #include <iostream> #include <cmath> class Point //Point类声明 { public: //外部接口 Point(int x=0, int y=0) : x(x), y(y) { } int getX() { return x; } int getY() { return y; } private: //私有数据成员 int x, y; }; float dist( Point& a, Point& b) { double x = a.getX() - b.getX(); double y = a.getY() - b.getY(); return static_cast<float>(sqrt(x * x + y * y)); } 解决方法:设计一个函数计算两点间的距离,解决方案普通函数,成员函数和类的组合都不好,最好采用友元关系。 友元 面向对象程序设计主张程序的封装、数据的隐藏,不过任何事物都不是绝对的,友元打破了这种封装和隐藏。 友元关系提供了一种共享机制,实现不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享。 通俗点举个例子,一个家庭需要通过防盗门窗、门锁、保险柜等措施不让外人接触,但在一些特殊情况下,例如全家出游,又需要检查煤气、水电情况

5.友元、运算符重载

限于喜欢 提交于 2020-03-20 12:37:11
1.友元函数  定义:在C++中,一个普通函数是不可以直接访问类中的任意成员的,但是如果把这个函数声明为友元函数,那么这个函数就可以访问类中的所有成员。     优点:能够不受限制地访问类中的任意成员,在一定程度上可以提高程序的执行效率。   缺点:打破类的封装性。   声明格式:friend 返回值数据类型 函数名(参数类别) 可以在类中的任意位置声明   (1)普通函数声明为友元函数 class Student{ friend void student_info(Student& student_info); public: Student(){} ~Student(){} protected: private: } //声明函数为友元函数 void student_info(Student& stu){}      (2)一个类的成员函数可以声明为另一个类的友元函数(一般不建议使用) class Cat;//引用形参,指针,引用 class Person{ public: Person(Cat& c):caty(c){} ~Person(){} void show(); private: Cat &caty; } class Cat { public: Cat(){} ~Cat(){} private: friend void show(); }   (3

C++友元函数

偶尔善良 提交于 2020-03-18 22:04:35
友元函数的基本概念 1、概念:可以在类A中通过关键字 friend 声明或定义 某个独立函数 或 另一个类B的某个成员函数 或 另一个类B 为类A的 友元函数 ,友元函数可以 无限制 的存取类A的成员(包括私有、公有和保护成员)。 2、定义形式:friend 函数类型 函数所在类名::函数名(参数列表); 3、友元函数可在类中的私有或公有部分通过关键字friend说明或定义,但如在类中声明,而在类外定义,就不能再在类外使用friend关键字。友元函数作用域的开始点在它的说明点,结束点和类的作用域相同。 4、友元函数应被看作类的接口的一部分,使用它的主要目的是提高效率,因为它可以直接访问对象的私有成员,从而省去调用类的相应成员函数的开销。友元函数的另一个优点是:类的设计者不必在考虑好该类的各种可能使用情况之后再设计这个类,而是可以根据需要,通过使用友元来增加类的接口。 一、类外的独立函数作为类的友元函数 类外的独立函数作为类的友元函数,这个独立函数其实就是一个普通的函数,仅有的不同点是:它在类中被说明为类的友元函数,可以访问该类所有对象的私有成员。 【例1】使用友元函数计算两点距离的例子 #include <iostream> #include <cmath> using namespace std; class Point {   private:    double X,Y;  

抽象基类、访问控制与继承和继承中的类作用域

我是研究僧i 提交于 2020-03-17 04:30:23
抽象基类 一个基类是抽象基类,它的虚函数必须是一个 纯虚函数 。纯虚函数是虚函数后加 =0 来定义的, =0 只能出现在虚函数的类内声明之后 : class Disc_quote : public Quote { public: Disc_quote() = default; Disc_quote(const std::string& book, doule price, size_t qty, double disc) : Quote(book, price), quantity(qty), discount(disc) {} // 纯虚函数 double net_price(size_t) const = 0; protected: size_t quantity = 0; double discount = 0.0; }; 抽象基类的定义:含有或者继承了纯虚函数(未覆盖)的类是一个抽象基类。 1. 抽象基类只负责定义接口; 2. 不能定义抽象基类的对象; 3. 一般来说,为纯虚函数提供定义是没有意义的, 毕竟在派生类中可能要覆盖该虚函数。也可以为这个纯虚函数提供定义,不过定义不能出现在类内; 4. 抽象基类的派生类必须将纯虚函数override, 否则该派生类也是一个抽象基类。 访问控制与继承 受保护的成员的访问控制

C++ Primer 学习笔记 第七章 类

依然范特西╮ 提交于 2020-03-03 05:59:05
类的基本思想是数据抽象和封装。数据抽象是一种依赖于接口和实现分离的编程技术,类的接口包括用户所能执行的操作,类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。封装实现了类的接口和实现的分离,封装后的类隐藏了它的实现细节,即类的用户只能使用接口而不能访问实现部分。 类要想实现数据抽象和封装,首先需要定义一个抽象数据类型,在抽象数据类型中,由类的设计者负责考虑类的实现过程,而使用该类的程序员只需要抽象地思考类型做了什么,而无须了解类型的工作细节。 我们可以通过抽象数据类型提供的接口来完成某些操作,但如果一个类没有任何接口供用户使用,只有一些数据成员,那这个类就不是抽象数据类型,一旦定义了一些成员函数供类的用户使用,它就变成了了抽象数据类型。 定义和声明成员函数的方式与普通函数差不多,成员函数的声明必须在类的内部,但它的定义既可以在类的内部,也可以在类的外部。定义在类内部的函数是隐式的inline函数。 Sales_data类: struct Sales_data { string isbn ( ) const { return bookNo ; } Sales_data & combine ( const Sales_data & ) ; double avg_price ( ) const ; string bookNo ; unsigned units

C++学习随笔之十一:C++中的代码重用

帅比萌擦擦* 提交于 2020-02-21 05:43:58
引言: C++ 的一个主要目的是代码重用,提高效率,公有继承是实现这个目的的一种机制。还有其他的机制,本部分主要介绍其他代码重用方法,一种是包含、组合或层次化,另一种是私有或保护继承,通常组合、私有继承和保护继承哟国语实现 has-a 关系,即新的对类将包含另一个类的对象。还有一种就是和函数模板对应的类模板。 1. 包含对象成员的类: 包含对象的类就是这样一种类:类中包含了这样的一个类成员:本身是另一个类的对象。这种方法称为包含、组合或层次化。 C++和约束:C++包含让程序员能够限制程序结构的特性——使用explicit防止单参数构造函数的隐式转换,使用const限制方法修改数据等等。这样做的根本原因是:在编译阶段出现错误要比在运行阶段出现错误要好,要优。 初始化顺序:当初始化列表包含多个项目时,这些项目被初始化的顺序为它们被声明的顺序,而不是它们在初始化列表中的顺序。例如: Student(const char *str,const double *pd,int n):scores(pd,n),name(str){} 则name成员仍将首先初始化,因为在类定义中它首先被声明。 接口和实现:使用公有继承是,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现)。获得接口是is-a关系的组成部分。而是用组合,类可以获得实现,但不能获得接口。不继承接口是has

友元

北慕城南 提交于 2020-02-12 16:29:09
1.使用原因 类的私有成员只能通过它的成员函数来访问。但是有的时候需要类的外部访问类的私有成员(或者保护成员)。为此,需要一种途径,在不放弃私有成员数据安全性的情况下,使得一个普通函数或者类的成员函数就可以访问某一类中的私有、保护成员。 c++中的友元为数据隐藏这堵不透明的墙开了一个小孔,外界可以通过这个小孔窥视类内部的密码。 2.友元函数的定义 即可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数。 友元函数不是当前类的成员函数,而是 独立于当前类的外部函数 ,但他可以访问该类所有的成员,包含私有成员、保护成员和公有成员。 3.友元函数 的声明 在函数名前加上关键字friend。 可以定义在类的内部,也可以定义在类的外部。 4.注意事项 友元函数不是成员函数 友元函数必须通过作为入口参数传递进来的对象名(或对象指针,或对象引用,) 来访问引用该对象的数据成员 void disp(Girl &x); cout<<"女孩的姓名是:"x.name<<",年龄:"<<x.age<<endl;  5.将成员函数声明为友元函数 一个类的成员函数也可以作为另一个类的友元,它是友元函数的一种,成为友元成员函数。 友元成员函数不仅可以访问自己所在类对象中的私有成员和公有成员,还可以访问friend声明语句所在类对象中的所有成员。 说明: