友元函数

友元

不羁岁月 提交于 2019-12-06 08:50:18
友元 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-05 03:22:32
1. 再谈构造函数 构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造 函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内 可以多次赋值。 class Date { public: //这样的构造函数中是赋初始值,不是初始化 //Date(int year,int month,int day) //{ // _year = year; // _month = month; // _day = day; //} Date(int year, int month, int day) :_year(year) //初始化列表 用:后面个参数赋值用,隔开,最后一个参数后不加分隔符 , _month(month) , _day(day) {} private: int _year; int _month; int _day; }; int main() { Date d1(2016, 6, 6); return 0; } 注意: 1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 。 2. 类中包含以下成员,必须放在初始化列表位置进行初始化: 引用成员变量 const成员变量 类类型成员(该类没有默认构造函数 3. 尽量使用初始化列表初始化,因为不管你是否使用初始化列表,对于自定义类型成员变量

第28课 友员的尴尬能力

◇◆丶佛笑我妖孽 提交于 2019-12-04 18:24:25
友元的概念 什么是友元? 友元 是C++中的一种关系 友元关系发生在 函数与类之间或者类与类之间 友员关系是 单向的,不能传递 友元的用法 在类中 以friend关键字 声明友元 类中的友元可以是 其它类或者具体的函数 友元 不是类的一部分 友元 不受类中访问级别的限制 友元可以 直接访问具体类的所有成员 在类中用friend关键字对函数或类进行声明 class Point {   double x;   double y; //访问级别是private:在类的外部无法直接访问x,y(友元函数除外)   friend void func(Point &p);//声明了一个友元函数,它不是类的成员函数。   //该函数将两个实体联系起来了,一个是Point类,一个是func这个全局函数。   //func这个全局函数是Point这个类的友元,进一步的说明了func这个全局函数现在拥有了友元的超能力。它就可以无限制的访问Point这个类的所有成员。 }; void func(Point &p) { } 友元的使用初探 #include <stdio.h> #include <math.h> class Point { double x; double y; public: Point(double x, double y) { this->x = x; this->y = y; }

第28课.友元的尴尬能力

断了今生、忘了曾经 提交于 2019-12-04 11:23:48
1.友元的概念 a.友元是c++中的一种关系 b.友元关系发生在 函数与类 之间或者 类与类 之间 c.友元关系是单项的,不能传递(充分不必要) 2.友元的用法 a.在类中以friend关键字声明友元 b.类的友元可以是其它类或具体函数 c.友元不是类的一部分(函数,是外界的。类就不用说了。) d.友元不受类中访问级别的限制(private;public) e.友元可以访问具体类的所有成员 #include <stdio.h> class Point { double x; double y; friend void func(Point &p); }; void func(Point &p) { } 3.友元的的尴尬 a.友元是为了兼顾c预言的高效性而诞生的 b.友元直接破坏了面向对象的封装性 c.友元在时间产品中的搞笑是得不偿失的 d.友元在现代软件工程中已经渐渐被遗弃 4.注意事项: === a.友元关系不具备传递性 b.友元可以是其它类的成员函数 c.类的友元可以是某个完整的类(友元类的所有成员函数都是另一个类的友元函数,分别于类友元, 友元关系不能被继承 ) eg: 函数与类之间的友元: #include <stdio.h> #include <math.h> class Point { double x; double y; public: Point(double x

C++_学习笔记

旧时模样 提交于 2019-12-04 08:19:21
C++ 面向对象特征:封装——抽象——继承——多态 https://www.runoob.com/ <命名空间> —————————————————————————————————————————————————————————————————————————————————————————— #include <iostream> 1 using namespace std; 2 using std::变量; 3 std::变量; cout cin 定义: namespace spaceA{ int a = 10; namespace spaceB{ struct std{ int age ; } } } 使用: using namespace spaceA; using spaceA::a; spaceA::a; <bool增强> —————————————————————————————————————————————————————————————————————————————————————————— bool a = true ; 1 bool b = false; 0 sizeof(a) = 一个字节; <三目增强> ———————————————————————————————————————————————————————————————————————————

C++面向对象 静态成员和友元

删除回忆录丶 提交于 2019-12-04 03:50:56
第十一章 静态成员和友元 11.1 静态成员 1.C++类当中的静态数据成员仍借用保留字static,但是与之前的静态全局变量,静态局部变量以及静态函数没有关系。 2.静态数据成员不占用具体对象的数据空间。 3.静态数据成员的创建和销毁处分权不属于任何对象。对象有权利读和写静态成员。静态成员应该在创建任何具体对象之前就可以访问,所以要求静态成员在创建类的任何对象 之前就要存在(犹如全局变量、全局对象在main函数前面执行一样)因此静态数据成员应该在主函数之前先定义初始化。 4.静态数据成员不能没有定义也不能不定义。应该将类的静态数据成员定义和初始化语句放在类的内部实现源文件当中。 格式为: 数据类型 类名::静态数据成员名=初始化值; 或者:  数据类型 类名::静态数据成员名(初始化值); (在这里不能再写保留字static) 5.静态数据成员的生命期是全局的,与是否创建了对象没有关系。 6.要访问静态数据成员的时候,可以用对象访问也更一般是用类名访问。 对象名.静态数据成员名 类名::静态数据成员名 7.静态成员函数的声明语法格式: static 返回类型 静态成员函数名(形式参数表)在类体外定义的时候不能添加保留字static! 8.静态成员函数可以被该类所有对象所使用,但是注意静态成员函数没有隐含传递所谓的“本对象地址”的指针形式参数this,只能显式地传递对象作为参数。

C++总结(1)keywords to the class

为君一笑 提交于 2019-12-03 15:38:26
目录 Chapter 1.关于类的关键字 1. class,struct与union 2.private,public与protected 3.friend 4.virtual 5.const 6.inline 7.template 8.delete与default 9.final与override 10.explicit 11.extern与static 12.constexpr Chapter 1.关于类的关键字 1. class,struct与union 1.1简述: ​ class是我们最为熟悉的C++类声明的关键字,便不再多提了,而C++的struct相比C中struct而言很不一样了,已经扩充了很多东西,而union是一种一种特殊的类,相比前两者就比较少用了,但也不排除有派得上用场的时候。 1.2 详解: struct与class ​ 刚从C转自C++时,大多数人总是仍把struct当作原来熟悉的包含各种数据的结构体,其实不然。士别三日,即更刮目相看。struct已经可以包含成员函数,可以继承,甚至可以多态,class能做到的,它基本上都可以做到。 ​ 那为啥还要class呢?那是因为它们二者还是有区别的,而且关键是它们的定位是不同的。 ​ 首先,struct与class最本质的区别是默认访问控制----struct是public的,class是private的。

C++对bool operator < (const p &a)const的运算符重载详解

让人想犯罪 __ 提交于 2019-12-03 06:22:53
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 <运算符符号>(<参数表>) { <函数体> }  运算符重载时要遵循以下规则: (1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符

C++语言学习(七)――友元

匿名 (未验证) 提交于 2019-12-03 00:41:02
C++语言学习(七)――友元 一、友元简介 1、友元简介 面向对象编程的类的设计机制实现了数据的隐藏与封装,类的成员变量一般定义为私有成员,成员函数一般定义为公有的,是类与外部的通信接口。在实践中,类外的某些函数需要频繁地访问类的成员变量,可以将类外的函数定义为类的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但友元破坏了类的封装性和隐藏性,使得非类的成员函数可以访问类的私有成员。 友元是C++语言中的一种关系,友元关系发生在函数与类之间或者类与类之间。友元关系是单向的,不能传递。 与类有友元关系的函数称为友元函数,与类有友元关系的类称为友元类。 2、友元的特性 友元的特性如下: A、在类中以friend关键字声明友元 B、类的友元可以是其它类或具体函数 C、友元不是类的一部分 D、友元不受类中访问级别的限制 E、友元可以直接访问具体类的所有成员 F、友元关系不能被继承 G、友元关系是单向的,不具交换性 H、友元关系不具有传递性 3、友元的本质 友元的本质,是让其它不属于本类的成员(全局函数,其它类的成员函数,其它类),成为本类的成员而具备本类成员的属性。 二、友元函数 1、友元函数简介 友元函数是可以直接访问类的私有成员的非成员函数,是定义在类外的函数

第六章 习题

匿名 (未验证) 提交于 2019-12-03 00:37:01
(1)运算符的重载实际上是 函数 的重载。 (2)运算符函数必须被重载为 非静态成员函数 或被重载为 友元函数 。 (3)成员函数重载运算符需要的参数的个数总比它的操作数 少 一个。 (4)重载赋值运算符时,通常返回调用该运算符的 对象的引用 ,这样赋值就能进行连续赋值操作。 (5)重载“[ ]”函数必须且只能带 1 个形参,且规定其参数的类型为 整型 。 (6)重载调用运算符函数可以带有 多 个参数。 (1)下列运算符中,不能被重载的是(B)。 A. [ ] B. ● C. ( ) D. / (2)下列描述重载运算符的规则中,不正确的是(C)。 A. 重载运算符必须符合语言语法 B. 不能创建新的运算符 C. 不能改变运算符操作的类型 D. 不能改变运算符原有的优先级 (3)下列运算符中,不能有友元函数重载的是(A)。 A. = B.> C. < D. <> (4)下列描述中,不正确的是(C)。 A. 赋值运算符有时也需要重载 B. 在重载增量或减量运算符时,若应用友元函数,则需要使用引用参数 C. 在任何情况下,重载运算符即可用友元函数,也可用成员函数 D. 若在某自定义类中重载了下标运算符“[ ]”,则可将该类的类对象当作一个“数组” (1)下标运算符的重载提供了在C++中实现安全的数组下标的一种方法。 ( 对 ) (2)对下标运算符“[ ]”,即可重载为类成员函数