友元函数
创建一个类,让他里面仅仅只有一个私有变量:
void Test(const Test& a)
{
a._a = 1;//可以在友元函数内部直接访问类的私有变量
}
class Test
{
friend void Test(const Test& a);//友元函数的声明;在哪个类里面声明,这个函数就是哪个函数的友元函数
private:
int _a;
};
int main()
{
Test a;
return 0;
}
想要通过一个类外的函数去访问类中的私有变量在一般情况下是不可行的,友元函数可以直接访问类的非公有成员,它的定义是在类外部的普通函数,不输入任何类,但是它需要在类的内部进行声明,声明时需要加上friend关键字。
●友元函数可以访问类的非公有成员,但它不是类的成员。
●友元函数不能用const进行修饰。
●友元函数可以在类中的任何地方进行友元声明,不受类访问限定符的限制。
●一个函数可以是多个类的友元函数。
●友元函数的调用和普通函数的调用原理相同。
友元函数的声明
友元函数的声明仅仅指定了访问的权限,而非一个通常意义上的函数声明。如果我们希望类的用户能够调用某个友元函数,那么我们必须在友元声明之外再专门对函数进行一次声明。
友元类
class A
{
private:
int _a;
};
class B
{
friend class A;//声明A类为B类的友元类
public:
void Test()//当A类为B类的友元类的,B类中的函数也可以访问A类中的任意成员
{}
private:
int _b;
};
int main()
{
A a;
B b;
return 0;
}
如果一个类指定了友元类,则友元类的成员函数可以访问此类包括非公有成员在内的所有成员。(友元类的所有成员函数都可以是另一个类的友元函数)
注意:
●友元关系是单向的,不具有交换性
●友元关系不能继承
●友元关系不能传递
友元类的优点:提高了程序的运行效率
友元类的缺点:破环了类的封装性和隐蔽性
内联函数
●将一个函数定义为内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,提高了函数运行的效率,但是增大了函数的体积。
作用:内联函数的作用类似于宏,再调用内联函数的地方用内联函数的内容进行替换,消去了函数调用时所需要的时间,提高了函数运行的效率,在Debug模式下不会替换,Release模式才会进行替换。
●inline是一种以空间换时间的做法,省去调用函数额外开销。所以代码很长或者有循环/递归的函数不适宜使用内联函数
●inline对于编译器而言,只是一个建议,编译器自动优化,如果定义为inline的函数体内部有循环/递归时,编译器优化时会忽略掉内联函数
●inline必须与函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不会起到作用的
●定义在类内的成员函数默认定义为内联函数