c++类中的静态成员
静态成员和非静态成员的区别:
- 类静态成员用static修饰,类的静态成员属于类本身,而不属于类的某个具体对象,静态成员被类的所有对象共享,因此某个对象对静态成员(数据成员)的修改对其对象是可见的。而类的非静态成员属于具体的对象,每个对象都有属于自己的非静态成员;
- 每个普通成员函数都隐含了一个this指针,指向类的对象本身,而静态成员不具有this指针
- 静态数据成员的类型可以是它所属类的类型,而非静态数据成员则受到限制,只能声明为它所属类的指针或引用
class type
{
static type a; //ok,静态成员可以是不完全类型
t *b; //ok,指针成员可以是不完全类型
t c; //error,数据成员必须是完全类型
public:
//...
}
- 静态成员可以作为默认实参,而非静态成员不能
class student
{
static int a;
public:
void fun(int b=a);
}
类的静态成员包括:
1)静态数据成员:类的静态数据成员存储在全局(静态)存储区,静态数据成员定义时要分配存储空间,而类定义本身不占用内存空间,只有在实例化为对象时才分配内存空间,因此静态数据成员不能再类中进行定义,static数据成员必须在类定义体外定义(初始化一次)
例外:基本类型是const static的数据成员可以在类的定义体中进行初始化,但仍必须在类的定义体外进行定义,只是不需要初始化
2)静态成员函数:由于静态成员函数属于类本身,而非静态成员数据属于具体的对象,所以类静态成员函数不能访问类的非静态成员,只能访问类的其他的静态成员,而非静态成员函数可以访问类的静态成员。
注:
- 类的静态成员函数不能被声明为const,因为const表明该成员函数不会修改该成员函数所属对象,而static成员函数不属于任何对象。
- static也不能被声明为虚函数,因为虚函数是为了实现多态的设计的,关于多态,简而言之就是用父类型别的指针指向其子类的对象,然后通过父类的指针调用实际子类的成员函数,也涉及到对象。
- 不能被声明为volatile
c++类中的静态成员的更多相关文章
- C++类中的静态成员变量与静态成员函数
最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与静态成员函数的理解感觉很是模糊,不明白为什么类中要是用静态成员变量.于是在网上搜集了一些资料,自己再稍微总结下. 静态成员的概念: 静态 ...
- C++类中的静态成员变量和静态成员函数的作用
数据成员可以分为静态变量.非静态变量两种. 静态成员:静态类中的成员加入static 修饰符,即是静态成员,可以使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配 ...
- C++ 类中的静态成员变量,静态成员函数
//类中的静态成员变量,静态成员函数 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; /* ...
- C++类中的静态成员变量与静态成员函数的使用
代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...
- C++模板类中使用静态成员变量(例如Singleton模式)
一个最简单Singleton的例子: ///////// Test.h /////////template <class _T>class CTest{private:_T n;stati ...
- C++程序设计方法3:类中的静态成员
在类型前面加static修饰的数据成员,是隶属于类的,成为类的静态数据成员,也称为“类的变量” 静态数据成员被该类的所有对象共享(即所有对象中的这个数据域实际上处于同一个内存位置) 静态数据要在实现文 ...
- Java 类中各成分加载顺序 和 内存中的存放位置
参加一个笔试,有一个关于类的静态代码块.构造代码块.构造函数的执行顺序的问题.不太清楚,网上百度了一下.在这里记录一下. 一.什么时候会加载类?使用到类中的内容时加载:有三种情况1.创建对象:new ...
- C++类中静态变量和静态方法使用介绍!
原链接:http://www.ecoviews.cn/net/archives/216.html 静态成员的提出是为了解决数据共享的问题.实现共享有许多方法,如:设置全局性的变量或对象是一种方法.但是 ...
- Java笔记(十二)……类中各部分加载顺序及存放位置问题
什么时候会加载类 使用到类中的内容时加载,三种情况: 创建对象:new StaticDemo(); 使用类中的静态成员:StaticCode.num = 9; StaticCode.getNum() ...
随机推荐
- hdu-5694 BD String(分治)
题目链接: BD String Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 根据ui控件的字体计算占用的长度
//1.根据icon计算name的长度 CGFloat nameX = CGRectGetMaxX(_icon.frame) + kBorder; CGFloat nameY = iconY; //计 ...
- noip2015day1 T1 4510 神奇的幻方
4510 神奇的幻方 noip2015day1 T1 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descripti ...
- 百度编辑器UEditor,地址栏传值长度有限-在webConfig配置
<system.web> <httpRuntime requestValidationMode=" ></httpRuntime> <compila ...
- ListView优化-getView优化
ListView作为Android中最常用的组件之一,其优化方式也比较多. 在使用ListView或是GridView的时候,往往需要自定义数据适配器.一般我们都需要复习getView方法.对于此方法 ...
- Part 13 Cast and Convert functions in SQL Server
Part 28 Cast and Convert functions in SQL Server
- sql语句创建主键、外键、索引、绑定默认值
use Mengyou88_Wuliu --创建公司表 create table dbo.Company2 ( CompanyID ,) not null, CompanyName ) null, A ...
- C语言知识总结(3)
数组 数组的特点: 只能存放一种类型的数据,比如int类型的数组.float类型的数组 里面存放的数据称为“元素” 初始化方式 ] = {, , }; ] = {,}; , , }; ] = {[]= ...
- 20150221—LINQ to SQL 查询数据
LINQ to SQL 可以快捷的查询基于SQL的数据,直接在VS中包括基本的Object/relation映射器,O/R映射器可以快速的将基于SQL的数据源映射为CLR对象,之后就可以使用LINQ查 ...
- 20141124-JS 变量,数据类型
变量: 变量是JS中存储信息的容器,必须以字母开头. 格式: 定义变量只能用 var 定义,用 = 赋值. <script> var x=2; </script> 字符串型的值 ...