C++解析四-友员函数、内联函数、静态成员

友元函数

类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。
如果要声明函数为一个类的友元,需要在类定义中该函数原型前使用关键字 friend,如下所示:

class Box
{
   double width;
public:
   double length;
   friend void printWidth( Box box );
   void setWidth( double wid );
};

声明类 ClassTwo 的所有成员函数作为类 ClassOne 的友元,需要在类 ClassOne 的定义中放置如下声明:
friend class ClassTwo;
请看下面的程序:

#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;
}

// 请注意:printWidth() 不是任何类的成员函数
void printWidth(Box box)
{
   /* 因为 printWidth() 是 Box 的友元,它可以直接访问该类的任何成员 */
   cout << "Width of box : " << box.width <<endl;
}

// 程序的主函数
int main()
{
   Box box;
   // 使用成员函数设置宽度
   box.setWidth(10.0);
   // 使用友元函数输出宽度
   printWidth(box);
   return 0;
}

编译输出:

[email protected]virtual-machine:~/Documents/Test/C++/four$ ./friend_func
Width of box : 10

友元函数的使用

因为友元函数没有this指针,则参数要有三种情况:
1. 要访问非static成员时,需要对象做参数;
2. 要访问static成员或全局变量时,则不需要对象做参数;
3. 如果做参数的对象是全局对象,则不需要对象做参数,可以直接调用友元函数,不需要通过对象或指针

实例代码:

class INTEGER
{
    friend void Print(const INTEGER& obj);//声明友元函数
};
void Print(const INTEGER& obj)
{
    //函数体
}
void main()
{
    INTEGER obj;
    Print(obj);//直接调用
}

原文地址:https://www.cnblogs.com/debruyne/p/9473725.html

时间: 2024-10-30 23:57:59

C++解析四-友员函数、内联函数、静态成员的相关文章

内联函数详解

什么是内联性和外联函数 类的成员函数可以分为内联函数和外联函数.内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内.而说明在类体内,定义在类体外的成员函数叫外联函数.外联函数的函数体在类的实现部分. 内联函数在调用时不是像一般的函数那样要转去执行被调用函数的函数体,执行完成后再转回调用函数中,执行其后语句,而是在调用函数处用内联函数体的代码来替换,这样将会节省调用开销,提高运行速度. 内联函数与前面讲过的带参数的宏定义进行一下比较,它们的代码效率是一样的,但是内联函数要优于宏定义

为什么内联函数,构造函数,静态成员函数不能为virtual函数?

1> 内联函数 内联函数是在编译时期展开,而虚函数的特性是运行时才动态联编,所以两者矛盾,不能定义内联函数为虚函数. 2> 构造函数 构造函数用来创建一个新的对象,而虚函数的运行是建立在对象的基础上,在构造函数执行时,对象尚未形成,所以不能将构造函数定义为虚函数. 3> 静态成员函数 静态成员函数属于一个类而非某一对象,没有this指针,它无法进行对象的判别. 这个可以从两个角度去理解:1.virtual意味着在执行时期进行绑定,所以在编译时刻需确定信息的不能为virtual     

内联函数对作用

一.什么是内联函数 内联函数必须是和函数体声明在一起,才有效.像这样的申明是没有效果的: Inline Tablefunction(int I) 编译器只是把函数作为普通的函数声明,我们必须定义函数体: Inline tablefunction(int I) {return I*I}; 这样我们才算定义了一个内联函数.我们可以把它作为一般的函数一样调用.但是执行速度却比一般函数的执行速度要快. 二.类中的内联函数 我们也可以将定义在类的外部的函数定义为内联函数,比如: Class TableCl

成员函数与内联函数

11.关于成员函数特征的下列描述中,______是错误的.   成员函数一定是内联函数   B. 成员函数可以重载     C. 成员函数可以设置缺省参数值   D. 成员函数可以是静态的   [A] [解析] 因为成员函数可以在类体内定义,也可以在类体外定义,所以成员函数不一定都是内联函数:成员函数可以重载,可以设置参数的默认值,成员函数可以是静态的. 内联函数是指在调用衣柜函数时,不把他当作调用而处理,而是把这个函数的代码直接在调用他的函数里展开的形式,也可以理解为内联函数就相当于一段代码.

关于内联函数的几点总结

为什么要引入内联函数(内联函数的作用) 用它替代宏定义,消除宏定义的缺点.宏定义使用预处理器实现,做一些简单的字符替换因此不能进行参数有效性的检测.另外它的返回值不能被强制转换为可转换的合适类型,且C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作. 1.内联函数与宏定义的区别: 内联函数在编译时展开,可以做一些类型检测处理.宏在预编译时展开:内联函数直接嵌入到目标代码中,宏是简单的做文本替换. C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能

内联函数替代有参宏

最近接到了一个老板的需求,要把我们的程序进行国际化,就是新增一个英语的支持.大致的需求是这个样子的:程序内添加语言切换选项,并在第一次安装的时候自动选择合适的语言(中文系统的手机(无论简体中文繁体中文)一律使用简体中文,其它语言的(无论英语还是法语德语)都默认使用英文).其实如果只是添加多语言支持,不再应用内切换语言,苹果的开发就能很好的支持了.就是多了这个应用内切换语言(像微信那样),逻辑就复杂了很多.因为之前的时候字符串都是写死在程序中的,所以不可能大范围的更改.又要涉及到语言的切换,所以,

C++内联函数详解

1.函数调用原理 "编译过程的最终产品是可执行程序--由一组机器语言指令组成.运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址.计算机随后将逐步执行这些指令.有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地址.常规函数调用也使程序跳到另一个地址(函数的地址),并在函数结束时返回.下面更详细地介绍这一过程的典型实现.执行到函数调用指令时,程序将在函数调用后立即存储该指令的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元

c++——inline内联函数

1 inline内联函数 C++中的const常量可以替代宏常数定义,如: const int A = 3; ? #define A 3 C++中是否有解决方案替代宏代码片段呢?(替代宏代码片段就可以避免宏的副作用!) C++中推荐使用内联函数替代宏代码片段 C++中使用inline关键字声明内联函数 内联函数声明时inline关键字必须和函数定义结合在一起,否则编译器会直接忽略内联请求. //宏替换和函数调用区别 #include "iostream" using namespace

解析内联函数

一.什么是内联函数?为什么使用内联函数? 调用函数是需要一定的时间和空间的开销的. 上图表示函数调用的过程,1程序执行函数调用前的语句:2流程的控制转移到被调用函数的入口处,同时进行参数传递:3执行被调用函数中函数体语句:4流程返回到调用函数的下一条指令处,将函数返回值带回:5接着执行主调函数中未执行的部分. 在2执行之前,要记下当时指令的地址还要"保护现场"(记下当时有关的信息),以便在函数调用之后继续执行,流程返回到先前记下的地址处,并根据记录下的信息"恢复现场"