0.目录

1.静态成员变量

2.静态成员函数

3.小结

1.静态成员变量

成员变量的回顾:

  • 通过对象名能够访问public成员变量
  • 每个对象的成员变量都是专属的
  • 成员变量不能在对象之间共享

新的需求:

  • 统计在程序运行期间某个类的对象数目
  • 保证程序的安全性(不能使用全局变量)
  • 随时可以获取当前对象的数目

在C+ +中可以定义静态成员变量:

  • 静态成员变量属于整个类所有
  • 静态成员变量的生命期不依赖于任何对象
  • 可以通过类名直接访问公有静态成员变量
  • 所有对象共享类的静态成员变量
  • 可以通过对象名访问公有静态成员变量

静态成员变量的特性:

  • 在定义时直接通过static关键字修饰
  • 静态成员变量需要在类外单独分配空间
  • 静态成员变量在程序内部位于全局数据区

语法规则(在类的外部)——Type ClassName::VarName = value;

示例:

#include <stdio.h>

class Test
{
private:
static int cCount;
public:
Test()
{
cCount++;
}
~Test()
{
--cCount;
}
int getCount()
{
return cCount;
}
}; int Test::cCount = 0; Test gTest; int main()
{
Test t1;
Test t2; printf("count = %d\n", gTest.getCount());
printf("count = %d\n", t1.getCount());
printf("count = %d\n", t2.getCount()); Test* pt = new Test(); printf("count = %d\n", pt->getCount()); delete pt; printf("count = %d\n", gTest.getCount()); return 0;
}

运行结果为:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
count = 3
count = 3
count = 3
count = 4
count = 3

2.静态成员函数

未完成的需求:

  • 统计在程序运行期间某个类的对象数目
  • 保证程序的安全性(不能使用全局变量
  • 随时可以获取当前对象的数目(Failure)

我们需要什么?

  • 不依赖对象就可以访问静态成员变量
  • 必须保证静态成员变量的安全性
  • 方便快捷的获取静态成员变量的值

在C++中可以定义静态成员函数:

  • 静态成员函数是类中特殊的成员函数
  • 静态成员函数属于整个类所有
  • 可以通过类名直接访问公有静态成员函数
  • 可以通过对象名访问公有静态成员函数

静态成员函数的定义——直接通过static关键字修饰成员函数:

静态成员函数不能直接访问普通成员变量:

#include <stdio.h>

class Demo
{
private:
int i;
public:
int getI();
static void StaticFunc(const char* s);
static void StaticSetI(int v);
}; int Demo::getI()
{
return i;
} void Demo::StaticFunc(const char* s)
{
printf("StaticFunc: %s\n", s);
} void Demo::StaticSetI(int v)
{
i = v;
} int main()
{
Demo::StaticFunc("main Begin..."); Demo d; Demo::StaticSetI(10); printf("d.i = %d\n", d.getI()); Demo::StaticFunc("main End..."); return 0;
}

报错信息:

[root@bogon Desktop]# g++ test.cpp
test.cpp: In static member function ‘static void Demo::StaticSetI(int)’:
test.cpp:6: error: invalid use of member ‘Demo::i’ in static member function
test.cpp:25: error: from this location

需要通过对象名访问:

#include <stdio.h>

class Demo
{
private:
int i;
public:
int getI();
static void StaticFunc(const char* s);
static void StaticSetI(Demo& d, 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;
} int main()
{
Demo::StaticFunc("main Begin..."); Demo d; Demo::StaticSetI(d, 10); printf("d.i = %d\n", d.getI()); Demo::StaticFunc("main End..."); return 0;
}

运行结果为:

[root@bogon Desktop]# g++ test.cpp
[root@bogon Desktop]# ./a.out
StaticFunc: main Begin...
d.i = 10
StaticFunc: main End...

静态成员函数 vs 普通成员函数:

3.小结

  • 类中可以通过static关键定义静态成员变量
  • 静态成员变量隶属于类所有
  • 每一个对象都可以访问静态成员变量
  • 静态成员变量在全局数据区分配空间
  • 静态成员变量的生命期为程序运行期
  • 静态成员函数是类中特殊的成员函数
  • 静态成员函数没有隐藏的this参数
  • 静态成员函数可以通过类名直接访问
  • 静态成员函数只能直接访问静态成员变量(函数)

C++解析(14):静态成员变量与静态成员函数的更多相关文章

  1. C++ 类中的静态成员变量,静态成员函数

    //类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* ...

  2. c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)

    一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...

  3. C++类中的静态成员变量与静态成员函数

    最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...

  4. 13.C++-静态成员变量、静态成员函数

    首先回顾下成员变量 能通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 再来讲讲类的静态成员变量 介绍 静态成员变量属于整个类所有 静态成员变量的生命期 ...

  5. static作用,静态成员变量和静态成员函数

    static关键字有俩作用:(1).控制存储分配:(2).控制一个名字的可见性和连接.   随着C++名字空间的引入,我们有了更好的,更灵活的方法来控制一个大项目的名字增长.     在类的内部使用s ...

  6. Java中非静态成员变量、静态成员变量的初始化时机

    转: Java中非静态成员变量.静态成员变量的初始化时机. 2018年05月22日 11:48:11 SilenceCarrot 阅读数 421   版权声明:技术就要分享才有意思,欢迎大家分享(注明 ...

  7. C++学习10 static静态成员变量和静态成员函数

    一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...

  8. C++之类的静态成员变量和静态成员函数

    static静态成员函数 在类中.static 除了声明静态成员变量,还能够声明静态成员函数. 普通成员函数能够訪问全部成员变量.而静态成员函数仅仅能訪问静态成员变量. 我们知道.当调用一个对象的成员 ...

  9. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

随机推荐

  1. 覆盖Django mysql model中save方法时碰到的一个数据库更新延迟问题

    最近有一个需求,通过django的admin后台,可以人工配置5张表的数据,这些数据进行一些业务规则处理后会统一成一份数据缓存在一个cache之中供服务端业务访问,因而任何一张表的数据更新(增.删.改 ...

  2. lamp环境搭建(centos6.9+apache2.4+mysql5.7+php7.1)

    lamp环境搭建(centos6.9+apache2.4+mysql5.7+php7.1) 安装前准备:CentOS 6.9 64位 最小化安装 yum install -y make gcc gcc ...

  3. Mac下 Windows 7 虚拟机成功搭建SVN服务器后如何与Xcode建立联系,并上传原始工程的详细步骤

    内容中包含 base64string 图片造成字符过多,拒绝显示

  4. jsp命名规则

    jsp也用驼峰规则命名即可,不要使用下划线,否则在tomcat中容易出现解析错误

  5. iOS 小技巧

    投影效果 scanBtn.layer.shadowColor = [UIColorblackColor].CGColor;//shadowColor阴影颜色     scanBtn.layer.sha ...

  6. 数据库表,id自动递增重置,从1开始

    问题: 删除数据表的数据后,发现下次插入数据,主键id并没有重置,还是在原来基础上继续增加 解决: ; TRUNCATE table table_name; ; 参考: https://stackov ...

  7. CentOS 6.8 安装JDK8

    JDK安装 1.查看环境是否有默认jdk,输入命令: rpm -qa | grep jdk 如果有默认jdk,可以使用 yum remove 删除 2.进入系统根目录,创建developer文件夹 3 ...

  8. 451. Swap Nodes in Pairs【LintCode java】

    Description Given a linked list, swap every two adjacent nodes and return its head. Example Given 1- ...

  9. 网络流小结(HNOI2019之前)

    \(\text{一:Dinic最大流}\) 最坏复杂度 \({\mathcal O(n^2m)}\) 一般可以处理 \(10^4\) ~ \(10^5\) 的网络. struct Edge { int ...

  10. ES6的新特性(21)——Proxy

    Proxy 概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy 可以理解成,在目标对 ...