C++之(内联函数、函数重载、友元、静态成员)

内联函数

在程序设计中,效率是一个重要指标。在 C 语言中,保护效率的一个方法是使用宏(Macro)。宏可以不用函数调用,但看起来像函数调用。宏是用预处理器来实现的。预处理器直接用宏代码代替宏调用,因此就不需要函数调用所需的保存调用时的现场状态和返回地址、进行参数传递等的时间花费。然而 C++的预处理器不允许存取私有 (Private)数据,这意味着预处理器宏在用作成员函数时变得非常无用。为了既保持预处理器宏的效率又增加安全性,而且还能像一般成员函数一样可以在类里访问自如,C++引入了内联函数 (Inline Function)。内联函数是一个函数,它与一般函数的区别是,在使用时可以像宏一样展开,所以没有函数调用的开销。因此,使用内联函数可以提高系统的执行效率。但在内联函数体中,不能含有复杂的结构控制语句,如语句switch 和 while等。内联函数实际是一种空间换时间的方案,因此其缺点是增大了系统空间方面的开销。在类内给出函数体定义的成员函数被默认为内联函数。

内联函数格式
inline 返回值类型 函数名(形式参数列表){ //函数体 }

注意

内联函数不宜过长;
在类内定义的成员函数默认为内联函数;
在类外给出函数体的成员函数,若要定义为内联函数,则必须加上关键字 inline。否则编译器将它作为普通成员函数对待;
递归调用的函数不能定义为内联函数。

函数重载

定义:函数重载是一种特殊情况,C++允许在同一作用域中声明几个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同,常用来处理实现功能类似数据类型不同的问题。

例如:

int swap(int* a,int* b);
double swap(float* a,float* b);
...

不仅函数可以重载,运算符也可以重载

重载的规则

函数名相同
参数列表不同(个数,类型,顺序)
不能以返回值不同来作为重载条件

重载的作用

重载函数通常用来在同一个作用域内 用同一个函数名 命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处

成员函数重载

成员函数重载主要应用于构造函数

例如一个程序求复数得运算

class Complex
{
public:
    Complex(double r, double i);
    Complex(double r);
    Complex();
};
class 

友元函数

类的一个特点就是数据隐藏,也就是类的私有成员或者保护成员只能通过其成员函数访问。

友元可以属于一个类的成员函数,也可以是不属于任何一个类的普通函数。

格式:

friend 函数返回值 函数名(形参表);

注意:

非成员函数成为类的友元函数后,如果在类外定义,则不能在函数名前加“类名:.”因为它不是该类的成员函数;非成员函数作为类的友元函数没有 this 指针;调用友元函数时业须在其实参表中给出要访问的对象。
友元函数既可以在类的私有部分进行声明,也可以在类的公有部分进行声明。
当一个函数需要访问多个类时,应该把这个函数同时定义为这些类的友元函数,这样该函数才能访问这些类的私有或保护成员,
如果友元函数带了两个不同的类的对象,其中一个对象所对应的类要在后面声明。为了避免编译时的错误,必须通过向前引用告诉 C++,该类将在后面定义。
class A
{
    void fun();
};
class B
{
    friend void fun();
};
//成员函数fun()声明为类B的友元函数,则就具有访问类B的保护成员和私有成员特权了。

友元类

class A
{
    void fun();
};
class B
{
    friend class A;
};
//A声明为B的友元类,那么A的每个成员函数就可以访问B的保护和私有成员。

注意:

友元关系是单向的,
友元关系不具有传递性

静态成员

定义

class Test{  
private:  
    //静态数据成员  
    static int a;  
}; 
int Test::a = 1;     //初始化

要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0

注意

静态数据成员被类的所有对象共享,包括该类的派生类对象,基类对象和派生类对象共享基类的静态数据成员
静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以

静态成员函数

静态成员函数的声明就是在类的成员函数前加上static关键字即可,和静态成员一样,静态成员函数也是属于类的,它并不属于任何对象,当调用静态成员函数时应该使用类名和域运算符“∷”,当然也可以使用对象调用操作,但是这样的操作并不意味着静态成员函数属于这个对象,它只是被这个对象共享而已,这样也就决定了静态成员函数中是不能访问本类中的非静态数据成员的,它是不能访问非静态数据成员的,在c++中静态成员函数主要用来访问静态数据成员而不访问非静态数据成员

静态成员函数不能调用非静态成员函数,但是反过来是可以的。
静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)
静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。
静态成员函数不能直接访问类中的非静态成员,若确实需要访问时,静态成员函数之能通过对象名访问该对象的非静态成员。

静态成员

格式:

static 类名 静态对象名;
静态成员的生命周期是从定义开始直到程序运行结束。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小谢%同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值