一、static 成员变量

对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。
如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可以用类的静态成员来解决这个问题。
非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。

(1)、static成员的定义

static成员需要在类定义体外进行初始化与定义

(2)、特殊的整型static const成员

整型static const成员可以在类定义体中初始化,该成员可以不在类体外进行定义

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
 
class Test
{
public:
    Test(): a(0) {}
    enum {size1 = 100, size2 = 200};
private:
    const int a;   //只能在构造函数初始化列表中初始化
    static int b;    //在类的实现文件中定义并初始化
    const static int c;    //与 static const int c; 相同。
};

int Test::b = 0; //static成员变量不能在构造函数初始化列表中初始化,因为它不属于某个对象。
const int Test::c = 0; //注意:给静态成员变量赋值时,不需要加static修饰符,但要加const

(3)、static成员优点:

static成员的名字是在类的作用域中,因此可以避免与其它类成员或全局对象名字冲突。

可以实施封装,static成员可以是私有的,而全局对象不可以

阅读程序容易看出static成员与某个类相关联,这种可见性可以清晰地反映程序员的意图。

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#ifndef _COUNTED_OBJECT_H_
#define _COUNTED_OBJECT_H_

class CountedObject
{
public:
    CountedObject();
    ~CountedObject();
public:
    static int GetCount();
private:
    static int count_;      // 静态成员的引用性声明
};

#endif // _COUNTED_OBJECT_H_

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include "CountedObject.h"

int CountedObject::count_ = 0;      // 静态成员的定义性声明

CountedObject::CountedObject()
{
    ++count_;
}

CountedObject::~CountedObject()
{
    --count_;
}

int CountedObject::GetCount()
{
    return count_;
}

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
#include "CountedObject.h"
#include <iostream>
using namespace std;

int main(void)
{
    //cout<<CountedObject::count_<<endl;
    cout << CountedObject::GetCount() << endl;
    CountedObject co1;
    //cout<<CountedObject::count_<<endl;
    cout << CountedObject::GetCount() << endl;
    CountedObject *co2 = new CountedObject;
    //cout<<CountedObject::count_<<endl;
    cout << CountedObject::GetCount() << endl;
    delete co2;
    //cout<<CountedObject::count_<<endl;
    cout << CountedObject::GetCount() << endl;

}

上述程序定义一个静态成员变量和静态成员函数,可以通过类名:: 访问static 成员变量,也可以通过非/静态成员函数访问。

二、static 成员函数

static成员函数没有隐含的this指针
非静态成员函数可以访问静态成员
静态成员函数不可以访问非静态成员(实际上是直接访问是不可以的,间接地访问是可以的,比如通过类指针或类引用)

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
#include <iostream>
using namespace std;

class Test
{
public:
    Test(int y) : y_(y)
    {

}
    ~Test()
    {

}

void TestFun()
    {
        cout << "x=" << x_ << endl; //OK,非静态成员函数可以访问静态成员
        TestStaticFun();
    }
    static void TestStaticFun()
    {
        cout << "TestStaticFun ..." << endl;
        //TestFun();        Error,静态成员函数不能调用非静态成员函数
        //cout<<"y="<<y_<<endl;     Error,静态成员函数不能访问非静态成员
    }
    static int x_;      // 静态成员的引用性说明
    int y_;
};

int Test::x_ = 100;     // 静态成员的定义性说明

int main(void)
{
    cout << sizeof(Test) << endl;

return 0;
}

三、类/对象大小计算

类大小计算遵循前面学过的结构体对齐原则(参照这里
类的大小与数据成员有关与成员函数无关(空类大小为1个字节)
类的大小与静态数据成员无关
虚函数对类的大小的影响(参考这里
虚继承对类的大小的影响(参考这里

参考:

C++ primer 第四版
Effective C++ 3rd
C++编程规范

static 成员变量、static 成员函数、类/对象的大小的更多相关文章

  1. Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)

    1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...

  2. 成员变量和成员函数前加static的作用?

    成员变量和成员函数前加static的作用?答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数.分别用来反映类的状态.比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作 ...

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

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

  4. c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用

    c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用 c++不会像上图那样为每一个对象的成员变量和成员函数开辟内存空间, 而是像下图那样,只为每一个对象的成员变量开辟空间.成员 ...

  5. python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  6. 2.2 C++类的成员变量和成员函数

    参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换 ...

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

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

  8. java面向对象---成员变量和成员函数

    //成员变量 1.类定义了对象中所具有的变量,这些变量称作成员变量 2.每个对象都有自己的变量,和同一个类的其他对象的分开的 //函数与成员变量 1.在函数中可以直接写成员变量的名字来访问成员变量,那 ...

  9. CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)

            所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...

  10. 【转】C++ const成员变量和成员函数(常成员函数)

    转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...

随机推荐

  1. Tiny microcontroller hosts dual dc/dc-boost converters

    Batteries are the typical power sources for portable-system applications, and it is not unusual thes ...

  2. lwIP Memory Management

    http://lwip.wikia.com/wiki/Lwipopts.h Memory management (RAM usage) /** * MEM_LIBC_MALLOC==1: Use ma ...

  3. mysql -h localhost和mysql -h 127.0.0.1的区别

    今天早上同事说MySQL root账号登录不上了.我试了一下 #mysql -u root -p 提示”Access denied for user ‘root’@’localhost’ (using ...

  4. C语言之数组中你所不在意的重要知识

    #include<stdio.h> void simpleArray(); void main() { simpleArray(); } //数组的简单操作 void simpleArra ...

  5. 无法执行磁盘检查因为windows无法访问

    固态硬盘迁移系统后,将原先的系统盘(H,重新系统后固态硬盘的主分区变为了C盘)格式化,并和邻近的D盘合并.合并后,将盘符重新改为D盘,而D盘原有的软件安装目录Program Files无法识别,显示目 ...

  6. Linux下查找命令(收集整理)

    原文:http://blog.csdn.net/sunstars2009918/article/details/8510878 一.Linux查找文件的相关命令 常 用 命 令 简要中文说明 程序所在 ...

  7. Javascript:拦截所有AJAX调用,重点处理服务器异常

    背景 上篇文章http://www.cnblogs.com/happyframework/p/3241063.html介绍了如何以AOP的形式处理服务器异常,这让服务器端的编程逻辑变的非常整洁,本文介 ...

  8. 提高软件质量实践——Facebook 篇

    提高软件质量实践——Facebook 篇 Facebook 从 2004 年的哈佛校园的学生项目在短短的 7~8 年的时间中快速增长为拥有 10 亿用户的世界上最大的社交网络,又一次见证了互联网创业成 ...

  9. iOS开源项目:JSONKit

    一个Json解析库,其特点是代码简单,只有一个.h和.m文件. https://github.com/johnezang/JSONKit JSON(JavaScript Object Notation ...

  10. Jackson 练习(一)

    package com.yc.model; /** * 班级 * @author Administrator * */ public class ClassModel { private String ...