为什么static成员必须在类外初始化,而不能在类的头文件中初始化
为什么static成员必须在类外初始化
为什么静态成员不能在类内初始化
在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。
class A
{
private:
static int count ; // 类内声明
};
int A::count = 0 ; // 类外初始化,不必再加static关键字
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
什么东西能在类内初始化
能在类中初始化的成员只有一种,那就是静态常量成员。
这样不行
class A
{
private:
static int count = 0; // 静态成员不能在类内初始化
};
这样可以
class A
{
private:
const int count = 0; // 常量成员也不能在类内初始化
};
这样也可以
class A
{
private:
static const int count = 0; // 静态常量成员可以在类内初始化
};
C++中类静态成员初始化的问题
在C++中静态成员只关联于类,而和类的具体对象不关联,类静态成员独立于任何一个对象而存在。特别的静态成员的类型可以是它所在的类,而非静态成员,而对于非静态成员则不行,非静态成员必须被声明为类对象的指针或者是引用。
class Bar
{
public:
//....
private:
static Bar mem1; //OK
Bar *mem2; //OK
Bar mem3; //ERROR
};
静态成员的声明只是告诉编译器类中存在这样一种类型,但是它并不分配内存空间,只有在定义时才会为其分配内存空间。在使用静态成员时必须先进行初始化,值得注意的是只有const整形成员才可以在类的内部进行初始化,且初始化值必须为常量表达式,而其它类型的成员则在类的外部进行初始化。
内部初始化实例:
#include <iostream>
using namespace std;
class CTest
{
public:
CTest() {}
;
void Print()
{
cout << "Hello world!\n" << a << endl;
}
protected:
private:
};
int main()
{
CTest t1;
t1.Print();
;
}
外部初始化实例:
#include <iostream>
using namespace std;
/************************************************************************/
/* 单例模式:保证一个类仅有一个实例 */
/************************************************************************/
class Singleton
{
private:
static Singleton* instance;
Singleton(){
}
public:
static Singleton* GetInstace()
{
if (NULL == instance)
{
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance =Singleton::GetInstace();
void main()
{
Singleton* instance = Singleton::GetInstace();
}
为什么static成员必须在类外初始化,而不能在类的头文件中初始化的更多相关文章
- php中的var关键字的用法总结(var在类外用报错)(类属性必须带限定词)
php中的var关键字的用法总结(var在类外用报错)(类属性必须带限定词) 一.总结 1.var在类外用报错:如果不是在类中,用var定义变量是错的. 2.类属性必须带限定词:php中类属性必须定义 ...
- 在头文件中声明class 类 与 include类所在的头文件区别---理解
在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...
- C++头文件中的模板类
C++头文件中的模板类 这已经是我的第三篇关于头文件的博客了,没想到我还是踩了个巨坑. 大家都知道要在头文件里声明类成员,在源文件中实现. 但是今天写数据结构作业,在头文件(Stack.h)定义了一个 ...
- Effective Objective-C 2.0 — 第二条:类的头文件中尽量少引入其他头文件
第二条:类的头文件中尽量少引入其他头文件 使用向前声明(forward declaring) @class EOCEmployer 1, 将引入头文件的实际尽量延后,只在确有需要时才引入,这样就可以减 ...
- [C/C++]在头文件中使用static定义变量意味着什么
文章出处:http://www.cnblogs.com/zplutor/ 看到有一位同学在头文件中这么写: static const wchar_t* g_str1 = - static const ...
- C++ vector 实现二维数组时, 在类的头文件中定义时遇到"应输入类型符"的问题?
见下,当我在类的声明文件中定义二维vector时,提示我应输入类型说明符; 但是相同的格式定义,在类中将二维vector修改为在源文件中定义就可以顺利通过,并顺利执行打印 打印结果如下: 望大神来解惑 ...
- Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)
错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...
- [Xcode 实际操作]九、实用进阶-(6)在Swift文件中调用Object-C的类和方法
目录:[Swift]Xcode实际操作 本文将演示在Swift文件中调用Object-C的类和方法. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个Object- ...
- C++11类内static成员变量声明与定义
众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享. 在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中. 因 ...
随机推荐
- used to do 与be used to doing /n.
1.used to do:表示过去的习惯性动作,过去如此,现在不再这样了.常译作“过去常常”.(过去时+动词不定式) He used to play basketball when he was yo ...
- Flask - 请求响应 | session | 闪现 | 请求扩展 | 中间件
请求响应 flask的请求信息都在request里 flask的响应方式有四剑客,也可以自定义响应 请求相关信息 # request.method 提交的方法 # request.args get请求 ...
- Windows异常的分发处理流程
根据异常来源,一般分硬件异常和软件异常,它们处理的流程大致一样,下面简单讲一下. 如果是硬件异常,CPU会根据中断类型号转而执行对应的中断处理程序.CPU会在IDT中查找对应的函数来处理,各个异常处理 ...
- 【FTP】Wireshark学习FTP流程
一.Wireshark概述 在windows下, 图1 Wireshark界面展示(基于1.99.1) Wireshark是通过底层的winpcap来实现抓包的.winpcap是用于网络封包抓取的一套 ...
- CSS3 新增选择器:伪类选择器和属性选择器
一.结构(位置)伪类选择器( : ) 1.:first-child 2.:last-child 3.:nth-child(n)或者:nth-child(2n)或者:nth-child(2n+1) &l ...
- PHP利用执行操作符;模拟shell命令
$out = `ls -la`; echo '<pre>'.$out.'</pre>'; 输出结果: total 10 drwxrwxrwx 1 root root 4096 ...
- Vim初学
实现G++编译 1,首先下载安装MinGW,下载地址在http://sourceforge.net/projects/mingw/.这个是边下载边安装的,下载完成即安装完成.我的安装目录是G:\Min ...
- 18、TaskScheduler原理剖析与源码分析
一.源码分析 ###入口 ###org.apache.spark.scheduler/DAGScheduler.scala // 最后,针对stage的task,创建TaskSet对象,调用taskS ...
- Halting Problem
Halting Problem: 传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4049 总结一个小规律:题目中给的 ...
- 安装vs code之后,win+e快捷键打开的是vs code,而不是文件管理器,解决方法
安装vs code之后,win+e快捷键打开的是vs code,而不是文件管理器,解决方法 xdg-mime default dde-file-manager.desktop inode/direct ...