C++友元
2014-02-22 13:29
274 查看
友元成员函数
这样在Key::set_Sound()中可以访问Car的私有成员(编译器在处理friend这条语句时,应先看到Key类的声明和set_Sound()方法的声明)。
在声明时要注意循环依赖(若class Key在class Car前声明,Key的成员函数的参数中有Car,若Car在Key前声明,则Car中有friend函数),解决方法是使用前向声明——
如果想让Key的成员函数成为内联函数,则可以用inline关键字——
内联关键字inline要与函数定义在一起(这体现了高质量C++编程风格的一个基本原则——声明和定义不可混为一谈——因为用户没必要知道函数是否内联),内联函数inline void Key::set_Sound(Car &c, int s) {...}对编译器是可见的(这样能在调用点展开函数)。在类声明中定义的成员函数将自动成为内联函数,这虽然方便,但不是一种良好的编程风格。
内联函数的机制是在函数C中调用了class A中的函数B,不是像外联函数那样跳转到B的函数体,执行完后再返回到C中,而是在C中展开B的运行代码,优势是节省了调用开销,提高了运行速度。
class Car { friend void Key::set_Sound(Car &c, int s); ... };
这样在Key::set_Sound()中可以访问Car的私有成员(编译器在处理friend这条语句时,应先看到Key类的声明和set_Sound()方法的声明)。
在声明时要注意循环依赖(若class Key在class Car前声明,Key的成员函数的参数中有Car,若Car在Key前声明,则Car中有friend函数),解决方法是使用前向声明——
class Car; //前向声明 class Key {...}; //注:这里只是成员函数的声明,因为如果定义函数中用到了Car的成员函数,那么在class Key之前应该有Car中函数的声明,而Car的声明在Key之后 class Car {...};//可声明,可定义 //这里定义Key的成员函数
如果想让Key的成员函数成为内联函数,则可以用inline关键字——
内联关键字inline要与函数定义在一起(这体现了高质量C++编程风格的一个基本原则——声明和定义不可混为一谈——因为用户没必要知道函数是否内联),内联函数inline void Key::set_Sound(Car &c, int s) {...}对编译器是可见的(这样能在调用点展开函数)。在类声明中定义的成员函数将自动成为内联函数,这虽然方便,但不是一种良好的编程风格。
class A { public: void B(); }; inline void A::B() {...}
内联函数的机制是在函数C中调用了class A中的函数B,不是像外联函数那样跳转到B的函数体,执行完后再返回到C中,而是在C中展开B的运行代码,优势是节省了调用开销,提高了运行速度。