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() ...
随机推荐
- android app性能优化大汇总(google官方Android性能优化典范 - 第2季)
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitmap的 ...
- part 4 AngularJS ng src directive
- 使用Bootstrap-Table 遇到的问题
最近用bootstrap-Table插件,遇到的问题记录下: 1.如何按条件查询时,pageNumber重置为1? $('#btnSub').bind('click', function () { $ ...
- DynamicObject数据包操作
DynamicObject的结构非常简单明了,就是一个字典,类似于一个Dictionary<string, object>,其中的object可能是一个简单值(普通字段),可能是一个复杂值 ...
- js格式化日期,获取当月的第一天,与最后一天.
//格式化日期 function setDate(date){ y=date.getFullYear(); m=date.getMonth()+1; d=date.getDate(); ...
- C#中 StringBuilder类 与 String类的区别---(转)
在找工作的时候,去了些公司,避免不了要面试和笔试.不过一般最起初的是笔试.我印象中有这样有一道题目:StringBuilder类与 String类的区别?那时候我不太清楚这两个类的区别,今天在看代 ...
- C++ 11 之初始化
1.4中不同初始化的形式 a.string s("zhl").int i(3); //括号初始化 b.string s="zhl".int ...
- 一点总结-关于debug比赛
上午的题目是: 1. main里面定义的变量必须手动初始化,使用memset或者其他,函数外或者函数内,会进行初始化为0. 2. 最长回文子串的马拉车manacher算法,不会写! 3. 数字三角形d ...
- LeetCode Weekly Contest 12
1. 第一题 看完题目后,肯定先对houses和heaters排序,然后考虑贪心可以么,我那时候没有想出来,然后看到可以O(n)的判断一个半径是否满足要求,就对半径[0,1e9]进行二分,然后就a了. ...
- DailyWallpaper - V1.01 released
桌面每日一图 最近发现美国国家地理网站上有个photo of the day很不错,地址在这里.http://photography.nationalgeographic.com/photograph ...