C++中的静态成员函数
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++中的静态成员函数的更多相关文章
- C++ 中的静态成员函数与静态成员变量
于CSDN 2014-01-17 与静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volu ...
- C++中静态成员函数和普通成员函数存储方式相同
先从一个示例查看类的创建过程中,静态成员函数和普通成员函数的存储区别. #include "stdafx.h" #include<iostream> #include& ...
- C++@类的静态成员变量和静态成员函数
参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...
- C++学习10 static静态成员变量和静态成员函数
一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...
- c++,static 静态成员变量 / 静态成员函数
静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...
- C++之类的静态成员变量和静态成员函数
static静态成员函数 在类中.static 除了声明静态成员变量,还能够声明静态成员函数. 普通成员函数能够訪问全部成员变量.而静态成员函数仅仅能訪问静态成员变量. 我们知道.当调用一个对象的成员 ...
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...
- C++类中的静态成员变量与静态成员函数的使用
代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...
- C++类中的静态成员变量与静态成员函数
最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
随机推荐
- JVM(16)之 双亲委派模型
开发十年,就只剩下这套架构体系了! >>> 在上一篇博文中,我们知道了如何获得二进制的字节流,并根据获得的字节流去装载一个类.同时也了解到类加载器的存在,每个加载器对应着不同的加 ...
- winform中进行post上传文件
winform中要上传文件到远程的服务器上面,我在本地用的是post方式传递数据,用的是HTTP协议,具体代码如下: 下面的代码就是一个上传的方法,参数需要路径和文件路径就可以了,我本地winform ...
- windows下nvm的安装及使用
由于更新了npm版本之后导致npm的命令都会报错,一顿百度,明白了nvm可以管理node版本的,下面是操作过程: 如果在安装nvm之前已经下载了node 需要把node卸载!!! 需要把node卸载! ...
- KVC、KVO 理解
参考经典链接: https://www.jianshu.com/p/f8198ca5e682 https://www.jianshu.com/p/be80318115a7 一. KVC 1.KVC介绍 ...
- 20個命令行工具監控 Linux 系統性能
對於每個系統管理員或網路管理員來說,每天要監控和調試 Linux 系統性能問題都是非常困難的工作.我已經有5年 Linux 管理員的工作經歷,知道如何監控系統使其保持正常運行.為此,我們編寫了對於 L ...
- 使用macOS苹方替换Windows 10微软雅黑
关于微软雅黑 Windows从Vista开始用到现在的”微软雅黑”十多年以来基本没什么大改动,而大家的显示器从CRT进化到了IPS高分屏,十年前看着还OK的字体现在在绝大多数屏幕上可能就是这个样子的: ...
- usb server新产品(旧老板设备)-给自己一个学习硬件的动力
- Machine Learning:机器学习算法
原文链接:https://riboseyim.github.io/2018/02/10/Machine-Learning-Algorithms/ 摘要 机器学习算法分类:监督学习.半监督学习.无监督学 ...
- java ArrayList练习题
package java06; /* *随机产生6的1——33的数字,并存储到列表中,再进行遍历 * */ import java.util.ArrayList; import java.util.R ...
- 关于嵌入式linux下的串口通讯问题---需增加回车/换行才能接收
问题:在Linux应用层,直接从/dev/tty***使用read()函数读数据,无法读到,只有在数据末尾加上0a/0d才可以读到数据(这里是发送十六进制的数据,ASCLL码同理,增加回车才可以读到数 ...