C++——内联函数与静态成员 – 作者:Johnson666

内联成员函数

在定义函数时,可以使用inline关键字将函数定义为内联函数。在定义类的成员函数时,也可以使用inline关键字将成员函数定义为内联成员函数。其实对于成员函数来说,如果其定义是在类体中,即使没有使用inline关键字,该成员函数也被认为是内联成员函数。例如:

#include<iostream>
using namespace std;

class User
{
private:
	char username[100];
	char password[100];
public:
	inline char *getUsername()const;  //定义一个内联成员函数
};

char* User::getUsername()const  //实现内联成员函数
{
	return (char*)username;
}

int main()
{
	User u1;
	u1.getUsername();
	return 0;
};

结果没有报错。

程序中使用inline关键字将类中的成员函数设置为内联成员函数。此外,也可以在类成员函数的实现部分使用inline关键字标识函数为内联成员函数。例如:

#include<iostream>
using namespace std;

class User
{
private:
	char username[100];
	char password[100];
public:
	char* getUsername()const;  //定义成员函数
};

inline char* User::getUsername()const  //函数为内联成员函数
{
	return (char*)username;
}

int main()
{
	User u1;
	u1.getUsername();
	return 0;
};

结果也没有报错,和上面那个是一样的。

程序中的代码演示了在何处使用关键字inline。对于内联函数来说,程序会在函数调用的地方直接插入函数代码。如果函数体语句较多,则会导致程序代码膨胀。如果将类的析构函数定义为内联函数,可能会导致潜在的代码膨胀。

静态类成员

类成员都是通过对象来访问的,不能通过类名直接访问。如果将类成员定义为静态类成员,则允许使用类名直接访问。静态类成员是在类成员定义前使用static关键字标识。例如:

class Book
{
public:
    static int price;
};

在定义静态数据成员时,通常需要在类体外部对静态数据成员进行初始化。例如:

int Book::price = 10;

对于静态成员来说,不仅可以通过对象访问,还可以直接使用类名访问。例如:

int main()
{
    Book book;
    cout << Book::price << endl; //通过类名访问静态成员
    cout << book.price << endl;  //通过对象访问静态成员
    return 0;
}

在一个类中,静态数据成员是被所有的类对象所共享的,这就意味着无论定义多少个类对象,类的静态数据成员只有一份,同时,如果某一个对象修改了静态数据成员,其它对象的静态数据成员(实际上是同一个静态数据成员)也将改变。
对于静态数据成员,还需要注意以下几点:
1.静态数据成员可以是当前类的类型,而其它数据成员只能是当前类的指针或应用类型。
在定义类成员时,对于静态数据成员,其类型可以是当前类的类型,而非静态数据成员则不可以,除非数据成员的类型为当前类的指针或引用类型。例如:

class Book
{
public:
    static int price;
    Book book; //非法的定义,不允许在该类中定义所属类的对象
    static Book VCbook;  //正确,静态数据成员允许定义类的所属类对象
    Book *pBook; //正确,允许定义类的所属类型的指针类型对象
};

2.静态数据成员可以作为成员函数的默认参数。
在定义类的成员函数时,可以为成员函数指定默认参数,其参数的默认值也可以是类的静态数据成员,但是不同的数据成员则不能作为成员函数的默认参数。例如:

class Book
{
public:
    static int price;
    int pages;
    void outputInfo(int data = price)
    {
        cout << data << endl;
    }
    void outputPage(int page = pages)  //错误的定义,类的普通数据成员不能作为默认参数
    {
        cout << page << endl;
    }
};

在介绍完类的静态数据成员后,下面说说类的静态成员函数。定义类的静态成员函数与定义普通的成员函数类似,只是在成员函数前添加static关键字。例如:

static void outputInfo();

类的静态成员函数只能访问类的静态数据成员,而不能访问普通的数据成员。例如:

class Book
{
public:
    static int price;
    int pages;
    static void outputInfo()
    {
        cout << price << endl; //正确的访问
        cout << pages << endl; //非法的访问,不能访问非静态数据成员
    }
};

在上述代码中,语句“cout << pages << endl;”是错误的,因为pages是非静态数据成员,不能在静态成员函数中访问。
此外,对于静态成员函数不能定义为const成员函数,即静态成员函数末尾不能使用const关键字。例如,下面的静态成员函数的定义是非法的。

static void outputInfo()const; //错误的定义,静态成员函数不能使用const关键字

在定义静态数据成员函数时,如果函数的实现代码处于类体之外,则在函数的实现部分不能再标识static关键字。例如,下面的函数定义时非法的。

static void Book::outputInfo() //错误的函数定义,不能使用static关键字
{
    cout << price << endl;
}

上述代码如果把static关键字去掉则是正确的。

void Book::outputInfo() //正确的函数定义
{
    cout << price << endl;
}

来源:freebuf.com 2021-05-21 22:32:08 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论