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 ...
随机推荐
- 给WebAPI的REST接口添加测试页面(二)
在上篇文章中,我对Swagger-UI的基本功能进行了一些介绍,今天在这里介绍一下如何在WebAPI中集成Swagger-UI.这里以一个简单的CRUD的REST服务为例. /// <summa ...
- Tasker 中文版(4.6u2)
http://www.anzhi.com/soft_1868913.html Tasker绝对称得上是Android系统的神器之一,与Auto Memory Manager不同,Tasker不是加速型 ...
- warning: suggest parentheses around assignment used as truth value
编译时的警告如下:
- VMware 11.0 简体中文版|附永久密钥
20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送) 国内私募机构九鼎控股打造,九鼎投资是在全国股 ...
- 搭建java开发环境:安装JDK
一:下载安装JDK,java7相对稳定成熟 (下载地址>>) 必须选择同意,然后根据自己的系统版本选择对应的jdk 如: 装完jdk就会提示安装jre,一般放同一目录下 配置系统变量: w ...
- 适配高分辨率的图片High DPI Images for Variable Pixel Densities
用最高的效率与性能提供最好的图片质量. 本文内容来至http://www.html5rocks.com/en/mobile/high-dpi/.是在这篇文章的翻译的基础上进行了总结和说明. 眼下面临的 ...
- 解决kylin报错:java.lang.ArrayIndexOutOfBoundsException: -1
报错信息: -- ::, INFO [pool--thread-] cli.DictionaryGeneratorCLI: : Building snapshot of ENERGON_DM.DM_D ...
- c#抓去网页
c#利用WebClient和WebRequest获取网页源代码的比较 2011-11-28 10:26:42 我来说两句 收藏 我要投稿 C#中一般是可以利用WebClient类和WebReq ...
- POJ 3069 Saruman's Army
Saruman's Army Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6688 Accepted: 3424 De ...
- php 验证身份证号码
身份证号码的结构 身份证号码是特征组合码,由17位数字本体码和一位校验码组成. 排列顺序从左至右依此为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码. 地址码(前六位数) 表示编 ...