友元类

Computer.h [友元] C++ 类

左心房为你撑大大i 提交于 2020-02-11 06:39:39
#pragma once #include #include <stdlib.h> #include using namespace std; //#include “ComputerService.h”//使用类的成员函数作为友元函数,必须包含其头文件 class Computer { public: string getcpu() { return cpu; } private: string cpu = “i5”; void friend upgrade(Computer* computer);//全局函数作为友元函数 //friend void ComputerService::upgrade1(Computer* computer);//类的成员函数作为友元函数 friend class ComputerService;//友元类 }; 来源: CSDN 作者: qq_44699909 链接: https://blog.csdn.net/qq_44699909/article/details/104219677

C++ 模板何时被实例化

匆匆过客 提交于 2020-02-06 05:30:07
今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后续查错,发现是自己忘记写结束符号了。 这就引出我知识点的不足了——之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化? 整理和理解网上资料后获得如下总结: 1. 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。   1.1声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义 。   1.2 定义一个类类型的对象时需要该类的定义,因此类模板会被实例化 。   1.3 在使用sizeof()时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化 .   1.4 new表达式要求类模板被实例化。   1.5 引用类模板的成员会导致类模板被编译器实例化。   1.6 需要注意的是,类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。 用来实例化成员函数的类型,就是其成员函数要调用的那个类对象的类型 总结1很好的解释了为啥我的程序在调用特定的成员函数时才会报错。 不过上面的介绍还是比较笼统,还有很多的细节点需要注意到,从网上转载如下:转载链接

类的友元

喜夏-厌秋 提交于 2020-02-02 05:20:56
一、介绍 属性变量是private类型,在类的外部是不能直接用 对象.属性 的方式访问的。 友元关系:一个类主动声明自己的朋友类、朋友函数,特许他们访问本类的数据。于是, 在友元函数中可以直接用对象.属性的方式访问 。它 适用于外界同时需要多个对象的私有属性 ,比如,求两点间距,而两点各为一个对象。 ( static静态变量 是同一个类的多个对象共享属于类而不属于任何对象的一个公共变量,要区分开,详情见 https://blog.csdn.net/floracuu/article/details/78106274 ) (实际上在类的外部写一个函数,接收形参为对象,在类中用一个成员函数将所需的属性值return出来即可。不过关于友元的讨论是基于想要直接用对象.属性的方式讨论的,所以以下的分析暂时忽略这种方式。这样看来,友元似乎不是必不可少的,希望自己可以早日真香,再来补充) 例: class Point { } ; 是一个二维坐标点的类,求两点间距,两个点各为一个对象,若求长度的函数写在类中,只能拿到本对象的坐标值,而不能拿到另一个点的值。写在外面,则两个点的坐标值都拿不到。所以要将计算距离的函数写在类的外面并且声明此函数为Point类的友元函数。 二、语法格式 1. 友元函数: 可以是普通函数,也可以是其他类的成员函数 声明,定义的方法是没有变化的,正常方式写就好,只是 需要在

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;//错误