c/c++ 友元的简单应用】的更多相关文章

友元的简单应用 1,对象 + 对象,或者,对象 + 数字,可以用类的成员函数去重载+号函数,但是,数字 + 对象就不能用类的成员函数去重载+号函数了, 因为编译器会把数字 + 对象翻译成数字.operator+(const 类 &对象),因为数字不是类的对象,无法传递给类的成员函数this指针. 用友元去重载:数字 + 对象 2,用友元去重载:>>运算符和<<运算符. 其实用类的成员函数也可以重载<<运算符,但是使用起来比较怪异,不能使用cout <<…
经过前面两个Review,对代码复用,类的继承概念有了进一步理解. 这里再做一次复盘,把其他概念也串联起来构成一个知识框架. 首先是类和对象的概念.对象指的是特征与技能的结合体,面向对象编程思想的好处是提高了程序的扩展性,可维护与可读性都变得更好. 类在构造时要考虑内存的动态分配问题,也有了构造函数.析构函数的概念. 为了使得对象的操作更加美观,有了运算符重载的技术. 函数的重载是C++语言不同于C语言的一大特征.重载的意义在于给调用者带来了很多方便,提高程序的可读性,根据实际运行情况决定同样的…
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作.具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通过一个副本改变其所指的值,则通过另一对象访问的值也会改变.所不同的是,智能指针能够对内存进行进行自动管理,避免出现悬垂指针等情况. 2.普通指针存在的问题 C语言.C++语言没有自…
1.前言 最近看了下<C++Primer>,觉得受益匪浅.不过纸上得来终觉浅,觉知此事须躬行.今天看了类类型,书中简单实现了String类,自己以前也学过C++,不过说来惭愧,以前都是用C来写程序,学的C++基本都忘记了,也说明自己以前对C++的理解不够深入.基于这些,觉得有必要动手来写写C++的一些程序了,毕竟C++有很多的功能是C所不具备的.正好看了课本中String类的简单实现,而且string类在C++中的使用频率也很高,了解其内部的实现是很有必要的.所以今天打算写个string类,就…
构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用 一个类若是只定义了私有的构造函数,将无法通过new关键字来创建其对象,若是没有定义,那么编译器会提供一个默认的构造函数,构造函数可以有多个, 构造列表:即构造函数初始值列表,在构造列表中的变量是直接初始化,在函数体内的则是先调用默认构造函数初始化再赋值,这不仅事关底层效率问题,更重要的是一些…
友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来补充介绍一个例外——友元(friend). 在C++中,这种关系以关键宇 friend 声明,中文多译为友元.友元可以访问与其有好友关系的类中的私有成员,友元包括友元函数和友元类.如果您对友元这个名词不习惯,可以按原文 friend 理解…
一.引言 C++控制对类对象私有部分(private)的访问,通常只能通过公有的(public)类方法去访问.但是有时候这种限制太严格,不适合特定的问题,于是C++提供了另外一种形式的访问权限:友元.友元有三种: 友元函数 友元类 友元成员函数 二.友元函数 通过让函数称为友元函数,可以赋予该函数与类的成员函数相同的访问权限.为何需要友元呢?在为类重载二元运算符时常常需要友元,关于运算符的重载可以参考我的博文: C++学习笔记之运算符重载 下面举例说明: //mytime0 #ifndef MY…
在团队开发中,如果一个程序集中要调用另外一个程序集,但是要被调用的那个程序集又不想用public来公开自己的类, 那么怎么办,就是用最后一种internal来用来做类的可见性了. 下面来看一个简单例子: 1. 在一个解决方案中创建两个类库项目A和B,分别在两个类库项目中创建类ClassA和ClassB 2. 将项目B中ClassB的访问级别设置为internal 3. 在项目A中添加对项目B的引用 4. 此时在ClassA中是访问不到ClassB的,如果想让ClassA可以访问ClassB,必须…
条款17 在operator=中检查给自己赋值的情况 1 2 3 class  X { ... }; X a; a = a;  // a 赋值给自己 >赋值给自己make no sense, 但却是合法的; 重要的是, 赋值给自己的情况可以以隐蔽的形式出现: a = b; 如果b是a的另一个名字(初始化为a的引用), 那也是对自己赋值; 这是一个别名的例子: 同一个对象有两个以上的名字; 别名可以以任意形式的伪装出现, 在写函数时一定要考虑到; Note 赋值运算符中要特别注意可能出现别名的情况…
1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单.清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数. 2.什么时候使用友元函数: 1)运算符重载的某些场合需要使用友元. 2)两个类要共享数据的时候 3.怎么使用友元函数: 友元函数的参数: 因为友元函数没有this指针,则…
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对运算符重载的函数有两种处理方式:(1)把运算符重载的函数作为类的成员函数:(2)运算符重载的函数不是类的成员函数,在类中把它声明为友元函数. 1    把运算符重载函数作为类的成员函数 在上一篇博客(http://www.cnblogs.com/hust-ghtao/p/3525522.html)中,运算符重载函数 operator + 就是属于这种形式…
friend是C++中封装的漏网之鱼. C++中的friend同意其它的类或者是函数訪问本类的不论什么成员.甚至是private成员,仅仅要该类声明其为友元. 但是,在有些情况下,并非同意外界訪问类的内部实现而使用友元. 这就是在 "模板定义" 与 "隐式类型转换" 之间的一个trick了. 首先,看一个简单的有理数的模板类.该类定义了有理数,而且实现有理数的乘法. 注:下述代码中,将operator*声明为非成员函数.是由于 "假设你须要对成员函数全部的…
对于这个类,写过程序的都知道应该含有的方法是 初始化.销毁.拼接.求长度.清除.判断是否为空等.还有一些操作符重载 一.先看初始化: 可以想到应该有默认构造的的.带有字符串的.带有默认字符的.还有一个拷贝构造函数 string() string(const char * sc, intlength); string(const char * sc); string(char c); string(const string& s); ~string(); 我们可以分别写5个initialize函数…
通过friend关键字,我们可以将不属于当前类的一个函数在当前类中加以声明,该函数便可以成为当前类的友元函数. 例1: #include<iostream>using namespace std; class book{public: book(){} book(char* a, double p); friend void display(book &b);private: double price; char * title;}; book::book(char* a, doubl…
项目开发的过程中,调试使用的可能是最多的操作.任何代码写出来都需要经过调试和整合,以此扩展和提升程序的稳定性和可靠性.谈到.NET的单元测试,在这里就得提提.NET的友元程序集这一特性,也借用.NET进行单元测试的一个较为好用的.NET属性,来讲解一下程序集.定制Attribute的相关知识.一些知识需要反复的去品味和反思,不要觉得你会了就不在意,等你在意的时候,你就有些力不从心的意思了. 生活在于不停的折腾,只有经过磨练,才可知何时需要安分,何时需要挑战. 毒鸡汤喝完了,来聊聊正事... 一.…
运算符重载(Operator overloading) 从我们在几个前篇的类的层次介绍中可以知道,C++可以扩展标准运算符,使其适用于新类型.这种技术称为运算符重载. 例如,字符串类重载+运算符,使其在应用于字符串时的行为会有所不同. 当C++编译器看到 + 运算符时,它通过查看操作数的类型来决定使用的是哪种运算,如果编译器看到 + 应用于两个整数,它会采用我们一般的数字相加. 如果操作数是字符串,那么实现的就是两个字符串之间的连接. 重载运算符的能力是C++的一个强大功能,可以使程序更容易阅读…
因为后续准备入职的公司都希望能转C++,所以最近也是按部就班的开始进行C++的学习.然后这个系列的文章打算探究C++的语言特性,也比较一下不同语言(如Java,Scala,Python,Go)之间的设计哲学,同时也抛砖引玉的希望能有大拿们的指点.最近在学习过程之中接触了友元函数与友元类的概念,第一篇文章我们就聊聊友元的概念. 1.友元函数: 开篇先简单介绍一下友元这个概念吧. 在C++之中,类的友元函数是定义在类外部,但它有权访问类的所有私有(private)成员和保护(protected)成员…
1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率       具体来说:为了使其他类的成员函数直接访问该类的私有变量       即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数       优点:能够提高效率,表达简单.清晰       缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数. 2.什么时候使用友元函数:       1)运算符重载的某些场合需要使用友元.       2)两个类要共享数据的时候 3…
在封装中C++类数据成员大多情况是private属性:但是如果接口采用多参数实现肯定影响程序效率:然而这时候如果外界需要频繁访问这些私有成员,就不得不需要一个既安全又理想的"后门"--友元关系; C++中提供三种友元关系的实现方式,友元函数.友元成员函数.友元类. 友元函数:既将一个普通的函数在一个类中说明为一个friend属性:其定义(大多数会访问该类的成员)应在类后: 友元成员函数:既然是成员函数,那么肯定这个函数属于某个类,对了就是因为这个函数是另外一个类的成员函数,有时候因为我…
demo 1 #include <iostream> #include <cstdio> using namespace std; //template <typename T> class Complex { friend ostream &operator << (ostream &out, Complex &c2); public: Complex(int a, int b) : a(a), b(b) {} Complex op…
一.前言 其实本人学习C++的目的,只是为了体会OOP设计思想,并为利用System Verilog验证复杂设计做准备.如果想要真正做点软件方面项目级的东西,还需要掌握其他高级语言和库.框架等知识.因此该系列博文仅注重语言基础和设计思想.上一篇该系列博文讲述了C++中基本的类封装,这次利用运算符重载友元函数来体会下C++的灵活性. 二.运算符重载友元函数  本文同样以<C++ Primer Plus>中的一个简单示例来讲解此内容.场景如下:时间粗劣地分为时和分两部分.需要完成两个时间的相加.时…
一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有本类中的函数可以访问本类的 private 成员.现在,我们来介绍一种例外情况——友元(friend).借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员.fnend 的意思是朋友,或者说是好友,与好友的关系显然要比一般人亲密一些.我们会对好朋友敞开心扉,倾诉自己的秘密,而对一般人会谨言慎行,潜意识里就自我保护.在C+…
1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单.清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数. 2.什么时候使用友元函数: 1)运算符重载的某些场合需要使用友元. 2)两个类要共享数据的时候 3.怎么使用友元函数: 友元函数的参数: 因为友元函数没有this指针,则…
1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数. 具体来说:为了使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 1.2使用友元函数的优缺点 优点:能够提高效率…
参考: http://www.weixueyuan.net/view/6350.html 总结: 借助friend关键字将其声明为友元函数,结果,在display函数体内,我们就能访问private属性的title和price成员变量 除了顶层函数可以被定义为友元函数之外,其它类的成员函数同样可以声明为本类的友元函数 例3中我们将date类声明为time类的友元类,此时date类中的所有函数都将成为time类的友元函数. date类是time类的友元类,但是time类不是date类的友元类.友元…
 原文地址:http://blog.csdn.net/insistgogo/article/details/6608672   1.为什么要引入友元函数:在实现类之间数据共享时,减少系统开销,提高效率 具体来说:为了使其他类的成员函数直接访问该类的私有变量 即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数 优点:能够提高效率,表达简单.清晰 缺点:友元函数破环了封装机制,尽量不使用成员函数,除非不得已的情况下才使用友元函数. 2.什么时候使用友元函数: 1)运算符重载…
C++中的友元函数主要应用于以下场景: 友元函数 第一种场景 代码中有一个全局函数,该函数想要去访问某个类的成员变量(该类的成员变量是private的,且该类并未提供任何获取获取私有成员变量的public方法),这时候可以在这个类中把该全局函数声明为友元函数,这样这个全局函数就具备了能够获取那个类的私有成员变量的资格. 例:通过友元函数获取Person类的各项字段信息: main.cpp #include <iostream> #include "Person.h" voi…
1.友元函数的简单介绍 1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率.如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数.具体来说:为了 使其他类的成员函数直接访问该类的私有变量.即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数. 实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 1.2使用友元函数的优缺点 1.2.1优点:能…
前言:友元对于我来说一直是一个难点,最近看了一些有关友元的课程与博客,故在此将自己的学习收获做一个简单的总结 一.什么是友元 在C++的自定义类中,一个常规的成员函数声明往往意味着: • 该成员函数能够访问其所在类的私有部分 • 该成员函数位于其所在类的作用域之中 • 该成员函数必须由一个对象去激活从而被调用(通过this指针来实现) 如果将一个函数声明为另一个类的友元,则可以使该函数只具有上面的第一个特性,即可以使该函数访问类中的私有部分. 友元函数的语法:friend+普通函数声明 友元类的…
今天的重载是基于C++ 类模板的,如果需要非类模板的重载的朋友可以把类模板拿掉,同样可以参考,谢谢. 一.类模板中的友元重载 本人喜好类声明与类成员实现分开写的代码风格,如若您喜欢将类成员函数的实现写在类声明中,那么可以跳过该部分. 请看下面这段代码: 头文件: #pragma once template<typename T> class CLA { T m_value; public: CLA(const T&); friend CLA operator+(const CLA&am…