【c++】内联函数和友元

一.内联函数

1.内联函数:以inline修饰的函数叫内联函数,编译时c++编译器会会在调用内联函数的地方展开,没有函数压栈开销,内联函数提升程序运行的效率

2.内联函数的效率:

  1. inline是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者有递归/循环的函数不适宜使用内联
  2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略内联
  3. inline定义的函数定义放在一起,才能成为内联函数,仅将inline放在声明前是不起作用的
  4. 定义在类内的成员函数默认为内联函数(如若定义在类外,会当成破普通函数对待)

3.宏的优缺点

优点:

  1. 增强代码的复用性
  2. 提高性能

缺点:

  1. 不会进行类型检测
  2. 代码膨胀(在预编译期间进行了替换)
  3. 不能调试
  4. 副作用(前置后置++)

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.注意:

  • 友元关系不能继承
  • 友元关系是单向的,不具有交换性
  • 友元关系不能传递

猜你喜欢

转载自blog.csdn.net/lw__sunshine/article/details/81074811
今日推荐