1,问完成的需求:

1,统计在程序运行期间某个类的对象数目;

1,静态成员变量满足了这个需求;

2,保证程序的安全性(不能使用全局变量);

3,随时可以获取当前对象的数目;

1,有没有什么特别的地方或边界点没有考虑到呢?

2,解决方案的尝试编程实验:

 #include <stdio.h>

 class Test
{
public:
static int cCount;
public:
Test()
{
cCount++;
}
~Test()
{
--cCount;
}
int getCount()
{
return cCount;
}
}; int Test::cCount = ; int main()
{
printf("count = %d\n", Test::cCount); // 打印 0; Test::cCount = ; printf("count = %d\n", Test::cCount); // 打印 1000; return ;
}

1,当没有定义对象时候,应该打印 0,而这里不能满足,完全没办法打印,因     为必须要对象才可以调用打印结果;

2,共有静态成员变量可以解决临界问题,但是不安全,会被误操作;

3,问题分析:我们需要什么?

1,不依赖对象就可以访问静态成员变量;

2,必须保证静态成员变量的安全性;

3,方便快捷的获取静态成员变量的值;

4,静态成员函数:

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

1,静态成员函数是类中特殊的成员函数;

2,静态成员函数隶属于整个类所有;

3,可以通过类名直接访问公有静态成员函数;

4,可以通过对象名访问公有静态成员函数;

5,静态成员函数的定义:

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

2,代码示例:

 class Test
2 {
public:
  static void Func1() {}
  static int Func2();
}; int Test::Func2()
{
  return ;
}

6,静态成员函数示例编程实验:

 #include <stdio.h>

 class Demo
{
private:
int i; public:
int getI();
static void StaticFunc(const char* s);
static void StaticSetI(Demo& d, int v);
// static void StaticSetI(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; // 这是通过对象名访问,没有直接访问成员变量;
} /*
void Demo::StaticSetI(int v)
{
i = v; // 编译器显示,在静态成员变量中不能访问成员变量 i;因为静态成员函数不可以直接访问成员变量,访问成员变量需要 this 指针的指向,而这里静态成员函数没有 this 指针;
}
*/ int main()
{
Demo::StaticFunc("main Begin..."); Demo d; d.StaticSetI(d, ); // 通过变量名调用静态成员函数 printf("d.i = %d\n", d.getI()); // 打印 1;和不同成员变量使用方法一样; Demo::StaticSetI(d, ); // 通过类名调用静态成员函数; printf("d.i = %d\n", d.getI()); // 打印 10; Demo::StaticFunc("main End..."); return ;
}

7,静态成员函数 vs 普通成员函数:

1,可以通过对象名调用静态成员函数;

2,不能访问普通成员变量和成员函数,因为没有 this 指针;

3,静态成员函数存放在代码段,可以供对象和成员函数调用;

8,最后的解决方案编程实验:

 #include <stdio.h>

 class Test
{
private:
static int cCount; // 不被外界访问,安全;一直存在;被静态成员函数访问,并通过类名调用; public:
Test()
{
cCount++;
} ~Test()
{
--cCount;
} static int GetCount()
{
return cCount;
}
}; int Test::cCount = ; int main()
{
printf("count = %d\n", Test::GetCount()); // 打印 0; Test t1;
Test t2; printf("count = %d\n", t1.GetCount()); // 打印 2;
printf("count = %d\n", t2.GetCount()); // 打印 2; Test* pt = new Test(); printf("count = %d\n", pt->GetCount()); // 打印 3; delete pt; printf("count = %d\n", Test::GetCount()); // 打印 2; return ;
}

9,小结:

1,静态成员函数是类中特殊的成员函数;

2,静态成员函数没有隐藏的 this 参数;

1,因此不能访问普通的成员函数及普通的成员变量;

3,静态成员函数可以通过类名直接访问;

4,静态成员函数只能直接访问静态成员变量(函数);

C++中的静态成员函数的更多相关文章

  1. C++ 中的静态成员函数与静态成员变量

    于CSDN 2014-01-17 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volu ...

  2. C++中静态成员函数和普通成员函数存储方式相同

    先从一个示例查看类的创建过程中,静态成员函数和普通成员函数的存储区别. #include "stdafx.h" #include<iostream> #include& ...

  3. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

  4. C++学习10 static静态成员变量和静态成员函数

    一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...

  5. c++,static 静态成员变量 / 静态成员函数

    静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...

  6. C++之类的静态成员变量和静态成员函数

    static静态成员函数 在类中.static 除了声明静态成员变量,还能够声明静态成员函数. 普通成员函数能够訪问全部成员变量.而静态成员函数仅仅能訪问静态成员变量. 我们知道.当调用一个对象的成员 ...

  7. c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)

    笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...

  8. C++类中的静态成员变量与静态成员函数的使用

    代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...

  9. C++类中的静态成员变量与静态成员函数

    最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...

随机推荐

  1. Go语言_方法和接口

    方法和接口 本节课包含了方法和接口,可以用这种构造来定义对象及其行为. Go 作者组编写,Go-zh 小组翻译. https://tour.go-zh.org/methods/1 方法 Go 没有类. ...

  2. k3 cloud中提示总账期末结账提示过滤条件太长,请修改此过滤条件

    k3 cloud中提示总账期末结账提示过滤条件太长,请修改此过滤条件,如下图所示: 处理方法: 请尝试系统配置文件common.config中将如附件所示的参数值改大,建议值为2000,并在系统清理缓 ...

  3. Prometheus + Grafana

    Prometheus ubuntu安装prometheus非常简单: apt update apt install prometheus systemctl enable prometheus sys ...

  4. 读取的CSV

  5. css 当文字过多时以....省略

    <!-- 公告 --> <p class="rst-promotion">公告: {{shopInfo.rst.promotion_info}}</p ...

  6. canvas 绘制三次贝塞尔曲线

    代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...

  7. springBoot相关(一)

    2.0新特性: 编程语言: Java8+.Kotlin 底层框架:Spring Framwork 5.0.x 全新特性: web Flux web Flux: 函数编程:java 8 Lambda 响 ...

  8. Struts2基础-1- 简单java类实现Action控制器

    Strut2中,Action可以不继承任何特殊的类或不实现任何特殊的接口,可以只编写一个普通的Java类作为Action类,只要该类含有一个返回字符串的无参的public方法即可!实际开发中,通常继承 ...

  9. iOS设计模式之工厂模式

    一,什么是工厂模式 模式定义: “专门定义一个类来负责创建其他类的实例,被创建的实例通常具有共同的父类.” 世界上就是由一个工厂类,根据传入的参数,动态地决定创建出哪一个产品类的实例. 需求场景: 简 ...

  10. 【HDU5306】【DTOJ2481】Gorgeous Sequence【线段树】

    题目大意:给你一个序列a,你有三个操作,0: x y t将a[x,y]和t取min:1:x y求a[x,y]的最大值:2:x y求a[x,y]的sum 题解:首先很明显就是线段树裸题,那么考虑如何维护 ...