static 成员变量、static 成员函数、类/对象的大小
一、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成员与某个类相关联,这种可见性可以清晰地反映程序员的意图。
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 #endif // _COUNTED_OBJECT_H_ |
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() CountedObject::~CountedObject() int CountedObject::GetCount() |
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) } |
上述程序定义一个静态成员变量和静态成员函数,可以通过类名:: 访问static 成员变量,也可以通过非/静态成员函数访问。
二、static 成员函数
static成员函数没有隐含的this指针
非静态成员函数可以访问静态成员
静态成员函数不可以访问非静态成员(实际上是直接访问是不可以的,间接地访问是可以的,比如通过类指针或类引用)
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 } } void TestFun() int Test::x_ = 100; // 静态成员的定义性说明 int main(void) return 0; |
三、类/对象大小计算
类大小计算遵循前面学过的结构体对齐原则(参照这里)
类的大小与数据成员有关与成员函数无关(空类大小为1个字节)
类的大小与静态数据成员无关
虚函数对类的大小的影响(参考这里)
虚继承对类的大小的影响(参考这里)
参考:
C++ primer 第四版
Effective C++ 3rd
C++编程规范
static 成员变量、static 成员函数、类/对象的大小的更多相关文章
- Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)
1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...
- 成员变量和成员函数前加static的作用?
成员变量和成员函数前加static的作用?答:它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数.分别用来反映类的状态.比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作 ...
- c++学习笔记之类和对象(三、static静态成员变量和静态成员函数)
一.static静态成员变量 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.是有时候我们希望在多个对象之间共享数据,对象 a 改变 ...
- c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用
c/c++ 类成员变量,成员函数的存储方式,以及this指针在c++中的作用 c++不会像上图那样为每一个对象的成员变量和成员函数开辟内存空间, 而是像下图那样,只为每一个对象的成员变量开辟空间.成员 ...
- python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据
默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...
- 2.2 C++类的成员变量和成员函数
参考:http://www.weixueyuan.net/view/6334.html 总结: 类成员的声明和定义: 类成员函数的定义分类内定义(内联)和类外定义(可用 inline 关键字 强制转换 ...
- C++学习10 static静态成员变量和静态成员函数
一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局 ...
- java面向对象---成员变量和成员函数
//成员变量 1.类定义了对象中所具有的变量,这些变量称作成员变量 2.每个对象都有自己的变量,和同一个类的其他对象的分开的 //函数与成员变量 1.在函数中可以直接写成员变量的名字来访问成员变量,那 ...
- CWnd和HWND的区别(hWnd只是CWnd对象的一个成员变量,代表与这个对象绑定的窗口)
所有控件类都是CWnd类的派生类,CWnd的所有成员函数在控件类中都可以使用.在MFC中,CWnd类是一个很重要的类,它封装了Windows的窗口句柄HWND.在Windows编程中, ...
- 【转】C++ const成员变量和成员函数(常成员函数)
转:http://c.biancheng.net/view/2230.html 在类中,如果你不希望某些数据被修改,可以使用const关键字加以限定.const 可以用来修饰成员变量和成员函数. co ...
随机推荐
- Delphi TFileStream 打开模式与共享模式
{ TFileStream create mode } fmCreate = $FF00; { Create a file with the given name. If a file with th ...
- JavaScript在IE6下超级链接window.location.href不跳转的bug 及 解决方案
今天遇到个很诡异的问题,就是<a href="javascript:void(0);" onclick="window.location.href=url" ...
- arcgis Listview
private ListView listView;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCrea ...
- 怎样加入cocostudio生成的UI到项目
cocos2dx版本号:cocos2d-x-3.2alpha0 cocostudio版本号:V1.4.0.1 1.将cocostudio生成的UI文件复制到项目Resources目录 2.加入头文件, ...
- Androidclient与服务端交互之登陆演示样例
今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...
- memcache在大型网站的应用策略
[部署策略] 基于memcached的 slab 和dump的内存管理方式,它产生的内存碎片比较少,不需要OS去做繁杂的内存回收,所以它对CPU的占用率那是相当的低.所以建议将它跟占用CPU较高 的W ...
- windows服务与计划任务
1. 打开Visual Studio 2012新建一个project Solution: 2. 选择Windows->windows Service,修改服务名称:MyFirstService: ...
- webbrowser 常用方法(C#)
0.常用方法 Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(st ...
- iOS:UI简单的总结
UI简单总结: 一.常用单例: NSBundle *bundel = [NSBundle mainBundle]; //加载资源 NSFileManager *fm = [NSFileManager ...
- Git使用sublime_text作用默认编辑器
Git使用的是Vim来作用默认的编辑器,但一直都用不好这个编辑器,所以打算把他换成sublime_text 使用windows默认的记事本 git config --global core.edito ...