一.内联函数
1.内联函数:以inline修饰的函数叫内联函数,编译时c++编译器会会在调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序运行的效率
2.内联函数的效率:
- inline是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者有递归/循环的函数不适宜使用内联
- inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略内联
- inline定义的函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不起作用的
- 定义在类内的成员函数默认为内联函数(如若定义在类外,会当成破普通函数对待)
3.宏的优缺点
优点:
- 增强代码的复用性
- 提高性能
缺点:
- 不会进行类型检测
- 代码膨胀(在预编译期间进行了替换)
- 不能调试
- 副作用(前置后置++)
4.注意:在c++中,强制建议使用const代替宏常量,使用内联函数替代宏函数,const和内联函数在编译期间不仅进行替换,而且还会进行参数检测,提高了程序的安全性,内联函数可以是普通函数,也可以是类的成员函数,函数式宏不能作为类的成员函数
#define MAX(a, b) (((a)>(b))? (a):(b))
/*
不会进行类型检测
代码膨胀
副作用
不能调试
*/
int main()
{
int a = 10;
int b = 20;
cout<<MAX(a, ++b)<<endl;
return 0;
}
int Add(int left, int right);
inline int Add(int left, int right)
{
//Add(left, left);
return left + right;
}
class CInt
{
public:
CInt::CInt(int data)
: _num(data)
{}
public:
int _num;
};
inline int Max(int left, int right)
{
return left > right ? left :right;
}
int main()
{
int a=10;
cout<<&a<<endl;
int b = 20;
int c;
c = Add(10, 20);
cout<<Max(a, ++b)<<endl;
CInt d(30);
return 0;
}
二.友元
友元分为友元函数和友元类
1.友元函数:
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加上friend关键字
class Date
{
friend void PrintDate(const Date& d);
public:
Date(int year,int month,int day)
:_year(year)
,_month(month)
,_day(day)
{}
private:
int _year;
int _month;
int _day;
};
void PrintDate(const Date& d)
{
cout<<d._year <<"-"<<d._month <<"-"<<d._day<<endl;
}
int main()
{
Date d(2017,1,1);
PrintDate(d);
return 0;
}
友元函数说明:
- 友元函数可以访问类的私有成员,但不是类的成员函数
- 友元函数不能用const修饰
- 友元函数可以在类定义的任何地方声明,不受类访问限定符的限制
- 一个函数可以是多个类的友元函数
- 友元函数的调用原理和普通函数相同
2.友元类:
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类非公有成员
class Date
{
friend void Show(const Date& d);//友元函数
friend class AA;//友元类
friend ostream& operator<<(ostream& out,const Date& d);
friend istream& operator>>(istream& in, Date& d);
public:
Date(int year,int month,int day)
:_year(year)
,_month(month)
,_day(day)
{}
void Show()const
{
cout<<_year <<"-"<<_month <<"-"<<_day<<endl;
}
private:
int _year;
int _month;
int _day;
};
void Show(const Date& d)
{
cout<<d._year <<"-"<<d._month <<"-"<<d._day<<endl;
}
class AA
{
public:
void Show(const Date& d)
{
cout<<d._year <<"-"<<d._month <<"-"<<d._day<<endl;
}
void Modift(Date& d)
{
d._year =2019;
}
};
ostream& operator<<(ostream& out,const Date& d)
{
out<<d._year<<"-"<<d._month <<"-"<<d._day<<endl;
return out;
}
istream& operator>>(istream& in, Date& d)
{
in>>d._year ;
in>>d._month ;
in>>d._day ;
return in;
}
int main()
{
Date d(2017,1,1);
Show(d);
int i=0;
cout<<i<<endl;
cin>>d;
cout<<d<<endl;
return 0;
}
3.友元优缺点:
- 优点:提高了程序运行效率
- 缺点:破坏了类的封装性和隐藏性,在使用有友元时,一定要注意场合时机
4.注意:
- 友元关系不能继承
- 友元关系是单向的,不具有交换性
- 友元关系不能传递