友元函数

C++——友元函数和友元类

最后都变了- 提交于 2019-11-28 07:52:25
友元函数:让函数可以访问类的私有属性 #include <iostream> using namespace std; class A { public: friend class B;//B类 是 A的好朋友 ,在B中可以访问A类的私有成员 私有函数 //1 声明的位置 和 public private没有关系 friend void modifyA(A *pA, int _a); //2 函数modifyA 是 类A的好朋友 A(int a=0, int b=0) { this->a = a; this->b = b; } int getA() { return this->a; } private: int a; int b; }; // void modifyA(A *pA, int _a) { //pA->a = 100; pA->a = _a; } void main2101() { A a1(1, 2); cout<< a1.getA()<<endl; modifyA(&a1, 300); cout<< a1.getA()<<endl; cout<<"hello..."<<endl; system("pause"); return ; } 友元类 若B类是A类的友员类,则B类的所有成员函数都是A类的友员函数 友员类通常设计为一种对数据操作或类之间传递消息的辅助类 来源

C++基础学习5

有些话、适合烂在心里 提交于 2019-11-28 07:12:18
9类和对象进一步 9.1构造函数 如果一个类中所有的成员都是公用的,则可以在定义对象时对数据成员进行初始化。 但是,如果数据成员是私有的,或者类中有private或protected的成员, 就不能用这种方法初始化。 class Time {public : //声明为公用成员 hour; minute; sec; }; Time t1={14,56,30}; //将t1初始化为14:56:30 构造函数的作用 构造函数的名字必须与类名同名,构造函数没有返回值,因此也不需要在定义构造函数时声明类型, 以便编译系统能识别它并把它作为构造函数处理。 在类内定义构造函数,也可以只在类内对构造函数进行声明而在类外定义构造函数。 构造函数不需用户调用,也不能被用户调用。 带参数的构造函数 构造函数首部的一般格式为构造函数名(类型 1 形参1,类型2 形参2, …) 定义对象的一般格式为 类名 对象名(实参1,实参2, …); #include <iostream> using namespace std; class Box {public : Box(int,int,int);//形参由定义对象时给出 int volume( ); private : int height; int width; int length; }; //声明带参数的构造函数//声明计算体积的函数 Box::Box

C++运算符重载

吃可爱长大的小学妹 提交于 2019-11-28 05:11:02
转载自:https://www.cnblogs.com/liangxiaofeng/p/4311796.html 1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型。但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作。这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数重载,它提供了C++的可扩展性,也是C++最吸引人的特性之一。 运算符重载是通过创建运算符函数实现的, 运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,惟一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下: <返回类型说明符> operator <运算符符号>(<参数表>) { <函数体> }  2.运算符重载时要遵循以下规则: (1) 除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载。 (2) 重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符。 (3) 运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。 (4)

C++之类之访问控制与封装

风流意气都作罢 提交于 2019-11-27 18:48:18
先看下封装有什么好处:   1. 一旦数据成员被定义成private,类的作者就可以自由修改数据,只要类的接口不变(public),用户代码就无需改变。   2.防止由于用户的原因造成数据被破坏,因为用户无法直接访问到private成员,所以当对象状态被破坏时,只有实现部分的代码采可能产生这样的错误,找bug会大大节省时间。 一、使用public和private封装:   在使用访问说明符之前,user可以直接到达类对象的内部并且控制它的具体实现细节:我们需要使用 访问说明符 (access specifiers)来对类进行 封装 ,使类的成员受到保护,想让谁看谁才能看到。 用public说明符修饰的成员在整个程序内都是可以被访问的,public成员定义的是类的接口。 用private说明符修饰的成员只能被类的成员函数访问,但是不能被类外的代码访问。private封装了部分实现细节。 一个类可以包含0或多个访问说明符,对于某个访问说明符能出现多少次也没有严格规定。 二、class和struct的区别: 其实这俩本来没啥区别,都是C++为了向下兼容C,唯一的区别就是:使用struct关键字定义的类,在第一个访问说明符之前的成员是public的;使用class定义的类在第一个访问说明符之前的成员是private的。 三、友元:   类可以允许其他类或者函数访问它的非公有成员

浅谈C++继承

人盡茶涼 提交于 2019-11-27 18:48:03
C++中的继承 1.继承概念及定义: 概念:是面向对象程序设计使代码可以复用的最重要的手段-----继承是类设计层次的复用 定义: 父类->基类;子类->派生类 总结: 基类的private成员在派生类中无论以什么方式继承都是不可见的。 这里的不可见是指基类的私有成员还是被继承到了派生类对象中, 但是语法上限制派生类对象不管在类里面还是类外面都不能访问 基类private成员在派生类中是不能被访问,如果基类成员不想在类外直接被访问,但需要在派生类 中能访问,就定义为protected。可以看出保护成员限定符是因继承才出现的。 基类的私有成员在子类都是不可见,基类的其他成员在子类的访问方式==Min(成员在基类的访问 限定符,继承方式),public > protected > private 使用关键字class时默认的方式时private,使用struct默认的继承方式时是public,不过最好显示的 写出继承方式。 在实际运用中一般使用都是public继承,几乎很少使用protected/private继承,这种继承下来的成 员只能在派生类的类里面使用,实际中扩展维护不强 2.基类和派生类对象赋值转换 派生类对象可以赋值给基类对象/基类的指针/基类的引用。 基类对象不能赋值给派生类对象 基类的指针可以通过强制类型转换赋值给派生类的指针,但是必须是基类的指针是指向派生类对象时

【C++】C++中的类模板

瘦欲@ 提交于 2019-11-27 15:35:44
基础的类模板 模板类的继承 内部声明定义普通模板函数和友元模板函数 内部声明友元模板函数+外部定义友元模板函数 声明和定义分别在不同的文件(模板函数、模板友元) C++中有一个重要特性,那就是模板类型。类似于Objective-C中的泛型。C++通过类模板来实现泛型支持。 1 基础的类模板 类模板,可以定义相同的操作,拥有不同数据类型的成员属性。 通常使用template来声明。告诉编译器,碰到T不要报错,表示一种泛型. 如下,声明一个普通的类模板: template <typename T> class Complex{ public: //构造函数 Complex(T a, T b) { this->a = a; this->b = b; } //运算符重载 Complex<T> operator+(Complex &c) { Complex<T> tmp(this->a+c.a, this->b+c.b); return tmp; } private: T a; T b; } int main() { //对象的定义,必须声明模板类型,因为要分配内容 Complex<int> a(10,20); Complex<int> b(20,30); Complex<int> c = a + b; return 0; } 2 模板类的继承 在模板类的继承中,需要注意以下两点:

友元函数、友元类

落爺英雄遲暮 提交于 2019-11-27 11:13:42
友元函数 可以将全局函数或者其他类成员函数声明为友元函数,友元函数内部可以使用类的私有成员 #include<iostream> using namespace std; class CCar; //提前声明CCar类,以便后面的CDriver类使用 class CDriver { public: void ModifyCar(CCar* pCar); //改装汽车 }; 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; return tmpMax; } int main() {

C++基础知识-DAY6

回眸只為那壹抹淺笑 提交于 2019-11-27 08:32:25
1. 友元 采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,,依此提供类与外界间的通信接口。 但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,有时可以将这些函数定义为该类的友元函数,除了友元函数外,还有友元类,两者统称为友元。 友元的作用是提高了程序的运行效率(即减少了类型和安全性检查及调用的时间开销),但他破坏了类的封装性和隐 藏性,使得非成员函数可以访问类的私有成员。 友元可以是一个函数,该函数被称为友元函数,友元也可以是一个类,该类被称为友元类。 1. Get/set Get 方法和 set 方法,是常见的获取数据成员的方式,比如在游戏中,任务遭到攻击后血量的减少就要用到 set 方法,而实时的显示就需要 set 方法 由于 _lifeBlood 是私有的,为了访问他,我们必须要做的事情就是通过函数来访问他,这就意味着,在这个过程中需要不断的压栈与出栈,那么就面临一个问题,怎么样才能提高战斗的效率呢 如果 fight() 内部的函数可以写成如下 这样就可以省去很多压栈出栈的开销,节约成本,但是由于 _lifeBlood 是私有的,不可以这样访问,除此之外,由于真正在游戏中,参与 fight 的对象是不定的,可以是多个,所以说 fight 常被写成全局函数,这样就更不能直接访问私有变量了

C++之路 Day8

左心房为你撑大大i 提交于 2019-11-26 10:20:36
本文是 友元 专题 什么是友元?英文翻译就是Friends。我们在设计一个类的时候考虑到封装性,访问权限,会把一些成员变量的访问属性定义为private,但是这样定义后,如果后期其它类想要访问这个类中的private访问属性的成员变量时,就需要修改那个类对应成员变量的访问属性,这样就修改了代码。那么如何做到不修改类成员变量访问属性的情况下,可以使其它类或全局函数访问到这个类的private访问属性的成员变量呢?友元,就这么被设计出来了。当然友元还有一种用途:要对流输出符<<重载时,这个后面再讲解。 先说说哪些我们已知的东西可以作为友元?全局函数,成员函数,一个类(中的全部成员函数)。直接看例子吧: //全局函数作友元 #include <iostream> #include <cmath> using namespace std; class Point{ public: Point(double x, double y){ _x = x; _y = y; } void getFormatxy(); friend double distance(Point &a, Point &b); private: double _x, _y; }; void Point::getFormatxy(){ cout<<"("<<_x<<","<<_y<<")"<<endl; } double

友元函数

筅森魡賤 提交于 2019-11-26 05:58:46
类的友元函数是定义在类外部,但有权访问类的所有私有成员和保护成员。尽管友元函数的原型有在类的定义中出现过,但友元函数并不是成员函数。 友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。在这种情况下,整个类及其所有成员都是友元。如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字friend,如下所示: class Box { double width; public: double length; friend void printWidth(Box box); void setWidth(double wid); }; 声明类ClassTwo的所有成员函数作为类的ClassOne的友元,需要在类ClassOne的定义中放置如下声明: friend class ClassTwo; /*** friend.cpp ***/ #include<iostream> using namespace std; class Box { double width; public: friend void printWidth(Box box); void setWidth(double wid); }; void Box::setWidth(double wid) { width = wid; } void printWidth(Box box) {