const成员函数:
const 成员函数可以使用类中的所有成员变量,但是不能修改它们的值,这种措施主要还是为了保护数据而设置的。const 成员函数也称为常成员函数。
内联函数:
为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。
注意 :要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。类的成员函数默认时内联函数。
友元函数:
1.友元函数:
借助友元(friend),可以使得其他类中的成员函数以及全局范围内的函数访问当前类的 private 成员。
友元函数可以是不属于任何类的非成员函数,也可以是其他类的成员函数。友元函数可以访问当
前类中的所有成员,包括 public、protected、private 属性的。friend 函数不仅可以是全局函数
(非成员函数),还可以是另外一个类的成员函数。友元类中的所有成员函数都是另外一个类的友元函数。
例如:
public:
friend void show(Student *pstu);
2.友元类
不仅可以将一个函数声明为一个类的“朋友”,还可以将整个类声明为另一个类的“朋友”,这就是友元类。友元类中的所有成员函数都是另外一个类的友元函数。
注意:友元的关系不是双向的,也不能传递
——————————————————————————————————————————————————————————
static 成员变量:
static 成员变量不属于某个类,是属于全局的,在外部初始化,必须在类外初始化,而且不占对象的空间
常考题:
如下代码:
class AA
{};
AA f (AA a)
{
return a ;
}
void Test1 ()
{
AA a1 ;
a1 = f(a1);
}
void Test2 ()
{
AA a1 ;
AA a2 = f(a1);
}
void Test3 ()
{
AA a1 ;
AA a2 = f(f(a1));
}
问题如下:
Test1中调用了 2 次AA的拷贝构造函数, 1 次AA的赋值运算符函数的重载。
Test2中调用了 2 次AA的拷贝构造函数, 0 次AA的赋值运算符函数的重载。
Test3中调用了 3 次AA的拷贝构造函数, 0 次AA的赋值运算符函数的重载。
做这类题记住一个原则:
传参,用类返回生成临时变量会调用拷贝构造
如果是初始化,如 date d2=d1 编译器会优化,不会调用赋值运算符重载
如果是赋值,如d2=d1,就不会优化,就会调用赋值运算符重载