C++分析讲解类的静态成员函数如何使用

目录
  • 一、未完成的需求
  • 二、问题分析
  • 三、静态成员函数
  • 四、小结

一、未完成的需求

  • 统计在程序运行期间某个类的对象数目
  • 保证程序的安全性(不能使用全局变量)
  • 随时可以获取当前对象的数目

在【C++基础入门】20.C++中类的静态成员变量中每次打印对象的个数时,都需要依赖于一个对象名,下面看一个代码:

#include <stdio.h>
class Test
{
public:
    static int cCount;
public:
    Test()
    {
        cCount++;
    }
    ~Test()
    {
        --cCount;
    }
    int getCount()
    {
        return cCount;
    }
};
int Test::cCount = 0;
int main()
{
    printf("count = %d\n", gTest.getCount);
    return 0;
}

按理说 count 应该输出为 0,但是 gTest 对象没有定义,所以编译就会报错:

有没有什么解决办法呢?下面再看一段代码:

#include <stdio.h>
class Test
{
public:
    static int cCount;
public:
    Test()
    {
        cCount++;
    }
    ~Test()
    {
        --cCount;
    }
    int getCount()
    {
        return cCount;
    }
};
int Test::cCount = 0;
int main()
{
    printf("count = %d\n", Test::cCount);
    Test::cCount = 1000;
    printf("count = %d\n", Test::cCount);
    return 0;
}

输出结果如下,Test::cCount = 1000; 可以认为是意外导致这个赋值,这样别人就会误认为这里面有 1000 个对象,这是不对的。

直接通过类名访问成员变量也是不可取的,安全性会打折扣。

那到底该怎么做呢?且看下面。

二、问题分析

需要做的事情

  • 不依赖对象就可以访问静态成员变量
  • 必须保证静态成员变量的安全性
  • 方便快捷的获取静态成员变量的值

三、静态成员函数

在 C++ 中可以定义静态成员函数

  • 静态成员函数是类中特殊的成员函数
  • 静态成员函数属于整个类所有
  • 可以通过类名直接访问公有静态成员函数
  • 可以通过对象名访问公有静态成员函数

静态成员函数的定义

直接通过 static 关键字修饰成员函数

下面看一个静态成员函数示例:

#include <stdio.h>
class Demo
{
private:
    int i;
public:
    int getI();
    static void StaticFunc(const char* s);
    static void StaticSetI(Demo& d, int v);
};
int Demo::getI()
{
    return i;
}
void Demo::StaticFunc(const char* s)
{
    printf("StaticFunc: %s\n", s);
}
void Demo::StaticSetI(Demo& d, int v)
{
    d.i = v;
}
int main()
{
    Demo::StaticFunc("main Begin...");
    Demo d;
    Demo::StaticSetI(d, 10);
    printf("d.i = %d\n", d.getI());
    Demo::StaticFunc("main End...");
    return 0;
}

输出结果如下:

当然,把Demo::StaticSetI(d, 10); 换成 d.StaticSetI(d, 10); 也是可以的哈,对应于前面讲的可以通过类名直接访问公有静态成员函数,也可以通过对象名访问公有静态成员函数。

如果把void Demo::StaticSetI(Demo& d, int v) 这里变成:

void Demo::StaticSetI(int v)
{
    i = v;
}

编译器就会报错:

这是因为静态成员函数不能直接访问成员变量,可以通过对象名访问公有静态成员函数。

静态成员函数 vs 普通成员函数

  静态成员函数 普通成员函数
所有对象共享 Yes Yes
隐含 this 指针 No Yes
访问普通成员变量(函数) No Yes
访问静态成员变量(函数) Yes Yes
通过类名直接调用 Yes No
通过对象名直接调用 Yes Yes

所以,满足 1. 统计在程序运行期间某个类的对象数目 2.保证程序的安全性(不能使用全局变量) 3.随时可以获取当前对象的数目的最终解决方案如下:

#include <stdio.h>
class Test
{
private:
    static int cCount;
public:
    Test()
    {
        cCount++;
    }
    ~Test()
    {
        --cCount;
    }
    static int GetCount()
    {
        return cCount;
    }
};
int Test::cCount = 0;
int main()
{
    printf("count = %d\n", Test::GetCount());
    Test t1;
    Test t2;
    printf("count = %d\n", t1.GetCount());
    printf("count = %d\n", t2.GetCount());
    Test* pt = new Test();
    printf("count = %d\n", pt->GetCount());
    delete pt;
    printf("count = %d\n", Test::GetCount());
    return 0;
}

输出结果如下:

四、小结

  • 静态成员函数是类中特殊的成员
  • 函数静态成员函数没有隐藏的 this 参数
  • 静态成员函数可以通过类名直接访问
  • 静态成员函数只能直接访问静态成员变量(函数)

到此这篇关于C++分析讲解类的静态成员函数如何使用的文章就介绍到这了,更多相关C++静态成员函数内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于C++静态成员函数访问非静态成员变量的问题

    复制代码 代码如下: class a{public:  static FunctionA()  {     menber = 1;  } private:  int menber;} 编译上述代码,出错.原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存.静态成员函数没有隐含的this自变量.所以,它就无法访问自己类的非静态成员. 那要想访问怎么办呢?地球人都知道只要将: 复制代码 代码如下: int me

  • 深入解析C++编程中的静态成员函数

    C++静态成员函数 与数据成员类似,成员函数也可以定义为静态的,在类中声明函数的前面加static就成了静态成员函数.如 static int volume( ); 和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分. 如果要在类外调用公用的静态成员函数,要用类名和域运算符"::".如 Box::volume( ); 实际上也允许通过对象名调用静态成员函数,如 a.volume( ); 但这并不意味着此函数是属于对象a的,而只是用a的类型而已. 与静态数据成员不同,静态成

  • C++的静态成员变量和静态成员函数详解

    目录 一.static修饰变量 二.static修饰函数 三.static在类中使用 1.创建与初始化 2.使用问题 3.在public.private下static变量使用 四.class含有static变量所占空间 五.练习题:求学生总人数.总分.平均分系统. 总结 static int a = 10;//在静态区分配空间,不在堆栈 在静态区分配空间,不在堆栈分配空间.因此,只有等到所以函数全部执行完成后,才会释放空间. 一.static修饰变量 void text() { static i

  • C++静态成员变量和静态成员函数的使用方法总结

    一.静态成员变量: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则.同时,静态数据成员还具有以下特点: 1.静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中. 其定义方式与全局变量相同.举例如下: xxx.h文件 class base{ private: static const int _i;//

  • C++ 中静态成员函数与非静态成员函数的区别

    静态成员函数与非静态成员函数的区别 数据成员: 静态数据成员是类的一部分,为类的所有实例共享(静态区):非静态数据成员,类的每个实例都有一份拷贝(动态区). 静态数据成员的访问: 静态数据成员是类的一部分,在产生任何实例之前已经存在,通过类名::静态成员变量名访问. 函数成员(都在代码区): 静态函数成员与非静态函数成员都为类所有,对象并不存在函数的拷贝.静态成员函数和非静态成员函数的根本区别在于非静态函数由对象名.或者对象指针->调用,调用时编译器会向函数传递this指针:静态成员函数则有类名

  • C++类静态成员与类静态成员函数详解

    当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关.静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关. 静态数据成员的用途之一是统计有多少个对象实际存在. 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的.也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一

  • C++静态成员函数不能调用非静态成员变量(详解)

    其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非静态成员函数是针对类的对象而言. 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能调用具体实例对象的成员. 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: #include <iostream> using namespace std; class vpoe

  • C++中静态成员函数访问非静态成员的实例

    C++中静态成员函数访问非静态成员的实例 实现代码: #include <iostream> /* 静态成员函数只能访问静态数据成员.静态成员函数和类以外的函数和数据,不能访问非静态数据成员,但静态成员函数或静态数据成员可由任意访问许可的函数访问.原因是:当前对象的地址(this)是被隐含地传递到被调用的函数的.但一个静态成员函数没有this指针,所以它无法访问非静态的成员函数. */ class a { public: static void FunctionA()//静态成员函数没有隐含的

  • C++类的静态成员变量与静态成员函数详解

    目录 1.类的静态成员变量 2.静态成员函数 总结 1.类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成员变量属于全局区,不属于类的空间. 3.静态成员变量通过类名访问,也可以通过对象访问,同一类的不同对象,静态成员共享同一份数据 下面通过代码验证以上三种说法: #include <iostream> using namespace std; class Base{ public: static int va

  • C++分析讲解类的静态成员函数如何使用

    目录 一.未完成的需求 二.问题分析 三.静态成员函数 四.小结 一.未完成的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 在[C++基础入门]20.C++中类的静态成员变量中每次打印对象的个数时,都需要依赖于一个对象名,下面看一个代码: #include <stdio.h> class Test { public: static int cCount; public: Test() { cCount++; } ~Test() {

  • C++分析讲解类的静态成员变量是什么

    目录 一.成员变量的回顾 二.新的需求 三.静态成员变量 四.小结 一.成员变量的回顾 通过对象名能够访问 public 成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 二.新的需求 统计在程序运行期间某个类的对象数目 保证程序的安全性(不能使用全局变量) 随时可以获取当前对象的数目 下面来看示例: #include <stdio.h> int gCount = 0; class Test { private: int mCount; public: Test() : mC

  • 浅析PHP的静态成员函数效率更高的原因

    很多php开发人员都知道, 使用类的静态成员函数效率比类的普通成员函数的要高,本文从应用层次分析这个问题 下面是一个范例: 复制代码 代码如下: <?php // php静态方法测试header('Content-Type: text/html; charset=utf-8');class xclass{     public static $var1 = '1111111111111111';     public $var2 = 'aaaaaaaaaaaaa';     public fun

  • 一般函数指针和类的成员函数指针深入解析

    函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样. 1.指向一般函数的指针函数指针的声明中就包括了函数的参数类型.顺序和返回值,只能把相匹配的函数地址赋值给函数指针.为了封装同类型的函数,可以把函数指针作为通用接口函数的参数,并通过函数指针来间接调用所封装的函数.下面是一个指向函数的指针使用的例子. 复制代码

  • C++中静态成员函数与静态成员变量(static )

    C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用.如果有一些C++知识记不清楚了,它可以帮你很快回忆起来. 复习C语言的static关键字 (1)加在局部变量的前面使之成为静态局部变量,作用域还是在函数内部,可是生存周期延长了. (2)加在全局变量的前面限定该变量作用域为文件作用域,就是说即使其他文件使用了extern扩展作用域也不行.这在C语言的多人项目中非常有用,避免了变量的重名.然而在C+

  • C++ 类的静态成员深入解析

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 静态成员的定义或声明要加个关键static.静态成员可以通过双冒号来使用即<类名>::<静态成员名>. 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变量和成员函数使用规则,再给出一个实例来加深印象.希望阅读本文可以使读者对类的静

  • C++简明分析讲解引用与函数提高及重载

    目录 详解引用 引用的基本使用 引用做函数参数 引用做函数返回值 常量引用 引用的本质 函数提高 函数默认值 函数占位参数 函数重载及注意事项 详解引用 引用的基本使用 语法:数据类型 &新变量名 =原来变量名 作用:给变量起别名 注意事项: 1.引用必须初始化 2.一旦初始化就不能更改(具体原因在下面引用本质上会讲到) 示例: int a = 10; int c = 20; 如果写 int &b;这是错误的,没有初始化引用,编译器不知道b指向的地址. 所以这样写 int &b=a

随机推荐