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. html-mailto

    MailTo 属性 mailto 属性可以设置到a 标签和form 标签中 例如: <a href="mailto:****@qq.com">send mail< ...

  2. IIS故障 应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。

    (尝试失败,但觉得有可行性) 参考https://www.cnblogs.com/qidian10/p/6028784.html https://yq.aliyun.com/articles/6434 ...

  3. 分析abex'crackme#2

    文件地址:https://www.wocloud.com.cn/webclient/share/sindex.action?id=i9K_Br6TgE4gbyGIlYkffWKcRy5TUdZ8U6_ ...

  4. Mata标签,og标签

    一.Mata标签 meta是用来在HTML文档中模拟HTTP协议的响应头报文,meta 标签用于网页的<head>与</head>中.meta 的属性有两种:name和http ...

  5. Ajax异步请求返回文件流(eg:导出文件时,直接将导出数据用文件流的形式返回客户端供客户下载)

    在异步请求中要返回文件流,不能使用JQuery,因为$.ajax,$.post 不支持返回二进制文件流的类型,可以看到下图,dataType只支持xml,json,script,html这几种格式,没 ...

  6. elasticsearch 基础 —— Update By Query API

    Update By Query API 最简单的用法是_update_by_query在不更改源的情况下对索引中的每个文档执行更新.这对于获取新属性或其他一些在线映射更改很有用 .这是API: POS ...

  7. YouCompleteMe报错可能是第三方库没有

    git submodule update --init --recursive 到YouCompleteMe安装目录下,执行上面的命令

  8. C# 对象转JSON字符串

    对象转JSON字符串 /// <summary> /// 对象转Json字符串 /// </summary> /// <param name="obj" ...

  9. 98-基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡) 光纤PCIe卡

    1.板卡概述 板卡采用xilinx Spartan6系列芯片,支持 PCI Express Base Specification 1.1 x1.内含丰富的逻辑资源和存储单元,板卡FPGA外接双片32M ...

  10. SpringBoot中发送邮件服务

    .转载:http://www.ityouknow.com/springboot/2017/05/06/spring-boot-mail.html 简单使用 1.pom 包配置 <dependen ...