C++ -- 类和对象之const成员函数,inline函数,友元,static成员

const成员函数

基础知识

1.定义
const成员函数是在类的成员函数后面加上const关键字,const修饰的是this指针所指向的对象,也就是保证调用这个const成员函数的对象在函数内不会被改变。
2.例子

class Date
{
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;
};
int main()
{
    Date d(2018,5,6);
    d.Show();
    system("pause");
    return 0;
}

3.运行结果如下:(可以看到正确输出)
这里写图片描述
4.编译器对const修饰的成员函数的处理
这里写图片描述

const修饰成员函数的扩展

1.非const对象可以调用const成员函数
这里写图片描述
2.const对象不能调用非const成员函数
这里写图片描述
3.const成员函数不能调用非const成员函数
这里写图片描述
4.非const成员函数可以调用const成员函数
这里写图片描述

inline(内联)函数

1.定义:
用inline修饰的函数叫做内联函数,编译时C++编译器会调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率。
2.例子:

class Date
{
public:
    Date(int year, int month, int day)
        :_year(year)
        , _month(month)
        , _day(day)
    {}
    void Show();


public:
    int _year;
    int _month;
    int _day;
};

inline void Date::Show() // 成员函数定义为内联
{
    cout << _year << "-"<< _month << "-" <<_day << endl;
}

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

友元

友元函数

1.定义
在一个函数的声明前面加上friend关键字,表示该函数为某个类的友元函数,则该函数可以访问类的私有或保护成员,友元函数不是类的成员函数。
2.例子
(1)如果在类外的一个函数想访问该类的私有或保护成员,如果不定义为友元,则无法访问私有成员。
这里写图片描述
(2)友元函数的书写

class Date
{
    friend void Show(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 Show(const Date& d)
{
    cout << d._year << "-" << d._month << "-" << d._day << endl;
}

运行结果:
这里写图片描述

友元类

1.如果想让某个类里访问另一个类的私有或保护成员,则将该类声明为那个类的友元类。
2.友元类的书写

class Date
{
    friend class Time;
public:
    Date(int year, int month, int day)
        :_year(year)
        , _month(month)
        , _day(day)
    {}
private:
    int _year;
    int _month;
    int _day;
};

class Time
{
    void Show(const Date& d)
    {
        cout << d._year << "-" << d._month << "-" << d._day;
    }
};

static

static修饰成员变量

1.在一个类的成员变量前面加上static关键字
2.例子

class A
{
private:
    static int count;
};

3.注意
(1)static修饰的成员变量必须在类外进行初始化。
若不在类外进行初始化,则会出现下面错误
这里写图片描述
在类外进行初始化正确的书写格式

class A
{
private:
    static int count;
};

int A::count = 0;

(2)类的静态成员为类的所有对象所共享。

static修饰成员函数

1.在一个类的成员函数前面加上static关键字,则该函数称为类的静态成员函数。
2.例子:

class A
{
public:
    static void Show()
    {
        cout << count << endl;
    }
private:
    static int count;
};

3.注意:
(1)类的静态成员函数没有this指针。
例如:
下面代码运行错误,因为静态成员函数没有this指针,所以不能访问类的普通成员变量(类的成员变量通过隐含的this指针来访问的)
这里写图片描述
(2)类的成员函数与成员变量都为类的所有对象所共享,也可以通过类名来进行访问。
例如:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/xu1105775448/article/details/80218618