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++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
随机推荐
- 33.Jump Game(跳步游戏)
Level: Medium 题目描述: Given an array of non-negative integers, you are initially positioned at the f ...
- Identity MVC:UI
基于原来做的cookie认证的代码:MvcCookieAuthSample 增加登陆和退出的方法: 增加Login和SignIn这两个Action方法. 在Views下面创建Account文件夹,然后 ...
- WEB应用安全解决方案测试验证
WEB应用安全解决方案测试报告 --- By jiang.jx at 2017-08-11 WEB应用安全解决方案.docx 链接:https://share.weiyun.com/068b05467 ...
- JVM(2)之 JAVA堆
开发十年,就只剩下这套架构体系了! >>> 之前我们说到了栈,它在内存中是连续的空间:保存一个个的栈帧,对应一次次方法的调用:还讲到了他是保存对象的引用,那么对象存在哪里呢?我们 ...
- Python元类之由浅入深
前言 元类属于python面向对象编程的深层次的魔法,非常重要,它使我们可以更好的掌控类从创建到消亡的整个生命周期过程.很多框架的源码中都使用到了元类.例如 Django Framework 中的 ...
- Splay平衡树入门小结
学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...
- BZOJ3926 诸神眷顾的幻想乡
传送门 树上SAM! 显然如果树上一条一条字符串放的话那么是n^2的w 但是 题目的性质非常吼啊! 20个叶子节点 我们就可以 把所有叶子结点拎出来当根 全部扔到一个SAM里 就吼啦 最后的答案是 ...
- python基础:11.列表对象属性排序
def __lt__ def __gt__ def __repr__
- 每天一个linux命令:less(14)
less less命令的作用与more十分相似,都可以用来浏览文字档案的内容,less 在查看之前不会加载整个文件 .用less命令显示文件时,用PageUp键向上翻页,用PageDown键向下翻页. ...
- Angular JS - 2 - angularjs helloworld
材料下载 https://github.com/liuch0228/AngularJS-learn.git 1.使用原生jquery实现 实现输入框内容 在页面上跟随输入值动态更新 项目路径 < ...