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. day4 RHCE

    12.实现一个web服务器 [root@server0 ~]# yum install httpd -y [root@server0 ~]# rpm -ql httpd 查看httpd产生的配置文件 ...

  2. 在sql server 中查找一定时间段内访问数据库情况

    total_worker_time AS [总消耗CPU 时间(ms)], execution_count [运行次数], qs.total_worker_time AS [平均消耗CPU 时间(ms ...

  3. 「日常训练」 Fire!(UVA-11624)

    与其说是训练不如说是重温.重新写了Java版本的代码. import java.util.*; import java.math.*; import java.io.BufferedInputStre ...

  4. rocketmq Lock failed,MQ already started -c参数

    今天部署rocketmq集群时一台机器部署一个master 和slave,slave部署总是失败,通过查看日志显示下面的错误 java.lang.RuntimeException: Lock fail ...

  5. 【转】AOE机制的DSL及其实际运用

    AOE这个词的意思,我相信玩过WOW的人都不陌生,包括玩过LoL的也不会陌生,说穿了就是一个区域内发生效果(Area of effect).这里我们要讨论的就是关于一个适合于几乎所有游戏的AOE机制, ...

  6. HTML/CSS的基本使用

    本篇博客主要介绍一下HTML/CSS的基本使用,关于它们的介绍便不在赘述,读者可自行google或百度. 一.HTML 先来简单介绍一下HTML标签: HTML 标签是由尖括号包围的关键词,比如 &l ...

  7. 关于Amazon.com Seller 网络以及IP地址更换 官方回答

    Greetings from Amazon Seller Support, I understand your concern that there will be a change of IP ad ...

  8. c++ Dynamic Memory (part 1)

    1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args ...

  9. Scrum立会报告+燃尽图(十月三十日总第二十一次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2290 项目地址:https://git.coding.net/zhang ...

  10. "群英队"电梯演讲

    视频如下: https://imgcache.qq.com/tencentvideo_v1/playerv3/TPout.swf?max_age=86400&v=20161117&vi ...