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++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
随机推荐
- 从“中产梦”中醒来,好好打工吧
"中产"定义 自打"中产阶级/阶层"概念出现,总有人试图给出定义.搞不清何为"中产"却试图定义"中产阶级/阶层",注定是 ...
- 关于微信小程序的一些总结
mpvue? {{}} 在vue和小程序中的区别? 01 小程序中{{}}和vue中的{{}}用法基本一致,可以显示data中的数据,可以写表达式 不一样的地方? 01 小程序的{{}}可以写在属性中 ...
- python 子类继承父类__init__(转载)
转载: http://www.jb51.net/article/100195.htm 前言 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__方法 ...
- ThreadPoolExecuotor源码参考
Executor --> ExecutorService --> AbstractExecutorService --> ThreadPoolExecuotor Executor接口 ...
- SpringBoot---缓存支持Cache
1.概述 1.1.在 Spring中使用缓存技术 的 关键 是配置CacheManager: SpringBoot为我们 自动配置了多个 CacheManager实现: Spring ...
- C#基础提升系列——C#任务同步
C#任务同步 如果需要共享数据,就必须使用同步技术,确保一次只有一个线程访问和改变共享状态.如果不注意同步,就会出现争用条件和死锁. 不同步导致的线程问题 如果两个或多个线程访问相同的对象,并且对共享 ...
- sublime text3 手动安装插件package control
好久没写了,今天换了新电脑,先安装前端神器“sublime” 一,安装 下载sublime,官方网址:http://www.sublimetext.com/: 二.插件包安装( Package Con ...
- PHP array_change_key_case() 函数
实例 将数组的所有的键转换为大写字母: <?php $age=array("Peter"=>"35","Ben"=>&qu ...
- JSON对象及方法
1.JSON JSON 包括 JSON 字符串和 JSON 对象.JSON 通常用于与服务端交换数据,在给服务器接收和发送数据时用的都是字符串,可以是 JSON 字符串或者一般的键值对字符串.把Jav ...
- NOIP 历年试题大致考点总结
总的来说,水平还不够-- 要努力了! NOIP2012 D1T1 模拟, 字符串 D1T2 贪心, 数学 (推导贪心策略), 高精度 D1T3 unsolved 开车旅行 倍增 D2T1 解线性模方程 ...