13.C++-静态成员变量、静态成员函数
首先回顾下成员变量
能通过对象名能够访问public成员变量
每个对象的成员变量都是专属的
成员变量不能在对象之间共享
再来讲讲类的静态成员变量
介绍
- 静态成员变量属于整个类所有
- 静态成员变量的生命期不依赖于任何对象(如同全局变量)
- 可以通过类名直接访问公有(public)静态成员变量
- 所有对象共享类的静态成员变量
- 可以通过对象名访问公有(public)静态成员变量
特性
- 在类里定义时直接通过static关键字修饰
- 静态成员变量需要在类外单独分配空间
- 静态成员变量在程序内部位于全局数据区
例如:
class Test{
public:
static int cnt; //static修饰,告诉编译器在Test类里有个静态成员变量cnt
};
int Test::cnt = 1; //在类外初始化,若不赋值则默认置0,写为:int Test::cnt;
int main()
{
Test::cnt = 100; //设置公有静态成员变量cnt=100
printf("cnt:%d\n",Test::cnt);
return 0;
}
如果static成员时const类型,则可以直接在类内部初始化赋值
例如:
class Test{
public:
const static int cnt = ; //类内部初始化
};
int main()
{
printf("cnt:%d\n",Test::cnt);
return ;
}
接下来做一个小实例
在程序运行时, 可以随时查询到某个类的对象的个数
保证程序的安全,不能使用全局变量
代码如下:
#include "stdio.h"
class Test{
private:
static int cnt;
public:
Test()
{
cnt++;
}
~Test()
{
cnt--;
}
int getCNT()
{
return cnt;
}
};
int Test::cnt = 0; //在类外赋值,使其分配空间
int main()
{
Test t1;
Test t2;
Test *t3;
printf("count:%d\n",t1.getCNT());
printf("count:%d\n",t2.getCNT());
t3= new Test;
printf("count:%d\n",t1.getCNT());
delete t3;
printf("count:%d\n",t1.getCNT());
return 0;
}
运行打印:
count:2
count:2
count:3
count:2
运行后,可以发现已经能够统计对象个数了.
但是还有缺点,调用这个getCNT()函数时,前提还要有个对象才行.
假如程序里没有对象了,就根本无法查询到count值.
所以我们还需要使用类的静态成员函数来完善它
静态成员函数
介绍
- 静态成员函数属于整个类所有
- 静态成员函数没有隐含this指针,无法直接访问非静态成员变量
- 可以通过类名或对象名来访问公有静态成员函数
静态成员函数定义和成员函数类似,唯一区别是,在类里定义时需要在前面加static关键字
例如:
class Test{
public:
static int func() { //定义func静态成员函数
//... ...
return 0;
}
}
或者:
class Test{
public:
static int func(); //定义func静态成员函数
}
int Test::func()
{
//... ...
return 0;
}
接下来完善上面实例,使用静态成员函数获取统计个数
#include "stdio.h"
class Test{
private:
static int cnt;
public:
Test()
{
cnt++;
}
~Test()
{
cnt--;
}
static int getCNT()
{
return cnt;
}
};
int Test::cnt = ; //在类外赋值,使其分配空间
int main()
{
printf("count:%d\n",Test::getCNT());
Test t1;
Test t2;
Test *t3;
printf("count:%d\n",Test::getCNT());
t3= new Test;
printf("count:%d\n",Test::getCNT());
delete t3;
printf("count:%d\n",Test::getCNT());
return ;
}
运行打印:
count:0
count:2
count:3
count:2
13.C++-静态成员变量、静态成员函数的更多相关文章
- c++——静态成员变量成员函数
静态成员变量成员函数 思考:每个变量,拥有属性.有没有一些属性,归所有对象拥有? 4.1静态成员变量 1)定义静态成员变量 关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象 ...
- c++,static 静态成员变量 / 静态成员函数
静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...
- C++@类的静态成员变量和静态成员函数
参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...
- C++静态成员函数不能调用非静态成员变量
其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话因为无论是静态成员函数还是静态成员变量,它们 都是在类的范畴之类的,及在类的整个生存周期里始终只能存在一份.然而非静态成员变量和非 ...
- static 关键字 静态成员变量及静态成员函数
static类成员 类成员类似于C语言的全局变量,但是与全局变量又有所不同,例如,全局变量是可以被任何的用户代码所修改,而且全局变量破坏了对象的封装性. 使用类的 static 成员的优点 使用 st ...
- C++解析(14):静态成员变量与静态成员函数
0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...
- c++ 静态成员变量
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- JAVA非静态成员变量之死循环
1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...
随机推荐
- idea出现Error:Maven Resources Compiler: Maven project configuration required for module 'market' isn't available.
idea出现如下错误解决办法 1.重新在Build-Rebuild project 既可以解决啦
- Yii2框架RBAC(Role-Based Access Control)的使用
1.在项目的common/config/main.php文件的components中添加如下代码: 'authManager' => [ 'class' => 'yii\rbac ...
- Yii2框架ACF(AccessControl Filter)的使用
AccessControl其实也就是 yii\filters\AccessControl Filter, 我们下面简写为 ACF 作为描述. ACF,访问控制过滤器,适用于简单的验证,面对的对象便是控 ...
- react——一个todolist的demo
代码如下: function ToDoListHeader(props) { return <h1 className={props.className}>ToDoList</h1& ...
- C语言老司机学Python (三)
条件语句: 注意1) condition后面的冒号 2) elif if condition_1: statement_block_1elif condition_2: statement_block ...
- mysql varchar vs oracle varchar2
1.错误提示: mysql的Data truncation: Data too long for column 'path' at row 1 错误原因: 1.字段过长而导致出错的, 2. 可能是因为 ...
- Lua Table转C# Dictionary
因为在游戏公司做web后台开发,经常会涉及到取游戏服务器的数据库里面读写各种操作. 昨天下午,服务器那边让我读一个配置显示到后台,让运营大佬们可以在web后台配置游戏参数. 本来以为很简单个事情,结果 ...
- 前端日常常用git命令
讲真,很早之前就想总结一下git常用的命令了,每次用着用着很多命令都记不住.而且我是英语渣包,有些单词慢慢靠背. git只是一个工具,我这写的只是适合我这种快速上手使用工具的小白,深究的请移步别处. ...
- C#制表符过滤处理方法
C#制表符过滤处理方法,动态替换字符串里面的制表符. /// <summary> /// Descrioption: ///需要替换字符集合,可参见MSDN /// The Trim me ...
- Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/pageFoo
1.错误描述 Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/ ...