美文网首页C++ 杂记
C++ 静态成员函数

C++ 静态成员函数

作者: 赵者也 | 来源:发表于2017-10-26 19:52 被阅读8次

通过将某个函数成员声明为 static,我们将使该函数独立于本类的任何具体对象。从静态函数内引用类成员,必须使用限定名进行(就像使用普通函数访问公有数据成员那样)。

静态成员函数的优点是:即使本类的任何对象都不存在,它们也能存在并被调用。这种情况下,静态成员函数只能使用静态数据成员,因为后者是唯一存在的数据成员。因此,即使我们不能肯定是否有类对象存在,也可以调用类的静态函数成员来检查静态数据成员。这样,我们即可用静态成员函数来确定本类的对象是否已经创建,或者实际创建的数量。

例:static void Afun(int n);

可以通过:

① aBox.Afun(10); //对象调用
②CBox::Afun(10); //类+作用域调用

下面是一个在 Qt 框架下,使用 Qt Creator 实现的一个简单的示例程序,我们可以从中看一下静态成员函数:

#include <QCoreApplication>
#include <QDebug>
#include <QUrl>

class OutputInfo
{
public:
    OutputInfo()
//        : m_printTimes(0) // [TOBY标记] 初始化成员列表的重要性
    {
        s_printTimes++;
        m_printTimes++;
    }
    ~OutputInfo(){
        s_printTimes--;
        m_printTimes--;
    }

    static void s_output() {
        qDebug() << "call static in static output "
                 << s_printTimes << " times print!";

        // 编译出错: 静态成员函数中不能引用非静态成员
//        qDebug() << "call normal in static output "
//                 << m_printTimes << " times print!"; // error
        /*
         * 因为静态成员函数属于整个类,
         * 在类实例化对象之前就已经分配空间了,
         * 而类的非静态成员必须在类实例化对象后才有内存空间,
         * 所以这个调用就出错了,
         * 这就是没有声明变量却去使用它
         */
    }

    void m_output() {
        qDebug() << "call static in normal output "
                 << s_printTimes << " times print!";
        qDebug() << "call normal in normal output "
                 << m_printTimes << " times print!";
    }

private:
    static int s_printTimes;
    int m_printTimes;
};

// 静态成员初始化
int OutputInfo::s_printTimes = 0;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    OutputInfo::s_output();

    OutputInfo* outputInfo = new OutputInfo;
    // 此调用中我们发现 m_printTimes 会显示乱码,
    // 这也告诉我们,[TOBY标记] 处初始化成员列表的重要性
    // 有了初始化,这个值就是 0,而不是乱码
    outputInfo->m_output();
    outputInfo->s_output();
    delete outputInfo;

    OutputInfo::s_output();

    outputInfo = new OutputInfo;
    // 此调用中我们发现 m_printTimes 会显示乱码,
    // 这也告诉我们,[TOBY标记] 处初始化成员列表的重要性
    // 有了初始化,这个值就是 0,而不是乱码
    outputInfo->m_output();
    outputInfo->s_output();
    delete outputInfo;

    // 我们不调用构造函数,我们是 0
    OutputInfo::s_output();
    OutputInfo::s_output();
    OutputInfo::s_output();

    return a.exec();
}

上面的示例的输出大概是下面这样的:

输出结果

欢迎大家提出宝贵意见,谢谢

相关文章

  • c++语法2

    接上篇我们继续学习静态成员、友元函数、继承、多重继承,继承访问权限等 静态成员与友元函数:c++中静态成员与jav...

  • C++中对Const用法的总结

    1、C++函数声明时在后面加const的作用:非静态成员函数后面加const(加到非成员函数或静态成员后面会产生编...

  • 深入理解C++对象模型

    1. C++对象模型 所有的非静态数据成员存储在对象本身中。所有的静态数据成员、成员函数(包括静态与非静态)都置于...

  • [初学C++]静态成员

    静态成员变量和成员函数 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所...

  • C++ 面向对象模型初探(8)

    1. 成员变量和函数的存储 c++中“数据”和“处理数据的操作(函数)”是分开存储的 c++中的非静态数据成员直接...

  • C++ 静态成员函数

    通过将某个函数成员声明为 static,我们将使该函数独立于本类的任何具体对象。从静态函数内引用类成员,必须使用限...

  • C++11可调用对象包装器和绑定器

    可调用对象 在C++中,可以像函数一样调用的有:普通函数、类的静态成员、仿函数、lambda函数、类的成员函数、可...

  • 电商专业学习嵌入式软件开发第五十八天

    C++第四天 今天讲的内容有静态成员变量和静态成员函数、引用、继承、拷贝构造函数,最后还带着我们完成了一个超市管理...

  • C++——静态成员函数与静态成员变量

    静态成员函数与静态成员变量使用static进行定义。 静态成员函数和静态成员变量其实就是全局函数与全局变量。 静态...

  • C++——静态成员函数与静态成员变量

    静态成员函数与静态成员变量使用static进行定义。 静态成员函数和静态成员变量其实就是全局函数与全局变量。 静态...

网友评论

本文标题:C++ 静态成员函数

本文链接:https://www.haomeiwen.com/subject/qatlpxtx.html