C++中静态成员变量要在类外部再定义或初始化的原因
C++中静态成员变量要在类外部再定义或初始化,否则会产生错误。
class A
{
public:
static int a;
};
int A::a=0;
为什么要在类的外部进行定义的原因:
1. 在类中,只是声明了静态变量,并没有定义。
2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。 注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。
3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。 类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。
4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?
静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。
因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。
这会产生两种可能的情况:
A. 重复定义;
B. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。
很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。
当然这样做,还是有可能产生线程安全的问题,但不管怎么说对象是创建好了,而这种线程安全问题,可以在编程中予以解决。
既然statci成员变量在类中只是声明那么就需要在类外部重新定义或者初始化
C++中静态成员变量要在类外部再定义或初始化的原因的更多相关文章
- 类中静态成员变量 && 无法解析的外部符号
[1]如下代码及编译错误 如标题,不做赘述. [2]原因及解决方案 原因:之所以报如上编译错误,因为静态成员变量未初始化. 解决方案:类中静态成员需要在类外进行初始化.其格式为:类型 类名::静态成员 ...
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
笔试经历 1 类中的静态变量不能通过构造函数参数列表来初始化,因为静态变量不属于哪个对象.同时静态变量在不初始化的情况下系统会自动为变量赋值,数值型赋值为零,字符型赋值为空. 非静态变量只有在定义时才 ...
- c++类模板中静态成员变量的声明定义
我们知道,c++中,类的静态成员是要在.cpp文件中定义的,如果在.h中定义,会出现重复定义. 但是在写类模板时,一般所有的代码都是放在.h文件中的,如果要做分离是一件很麻烦的事.那如果出现了静态成员 ...
- C++类中的静态成员变量与静态成员函数的使用
代码: #include <iostream> #include <string> #include <cstdio> using namespace std; c ...
- C++ 类的静态成员变量及静态成员函数
ps:下面所说 成员=成员变量+成员函数: 作用 由于对象与对象之间的成员变量是相互独立的.所以要想共用数据,则需要使用静态成员和静态函数. 空间分配 静态成员是在程序编译时分配空间,而在程序结束时释 ...
- c++,static 静态成员变量 / 静态成员函数
静态成员变量: //静态成员变量(static) // //1.如果想在同类的多个对象之间实现数据共享 ,可以用静态 //成员变量,即用static修饰的成员变量,例 static int a; // ...
- C++解析(14):静态成员变量与静态成员函数
0.目录 1.静态成员变量 2.静态成员函数 3.小结 1.静态成员变量 成员变量的回顾: 通过对象名能够访问public成员变量 每个对象的成员变量都是专属的 成员变量不能在对象之间共享 新的需求: ...
- C++中类的静态成员变量
1,成员变量的回顾: 1,通过对象名能够访问 public 成员变量: 2,每个对象的成员变量都是专属的: 3,成员变量不能在对象之间共享: 1,在做程序设计中,成员变量一般是私有的.至少不是公有的: ...
- JAVA非静态成员变量之死循环
1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls ...
随机推荐
- Angular6 学习笔记——路由详解
angular6.x系列的学习笔记记录,仍在不断完善中,学习地址: https://www.angular.cn/guide/template-syntax http://www.ngfans.net ...
- vertica内存不足的解决方案
执行以下语句: alter resource pool general MAXMEMORYSIZE '80%'; 当内存达到80%时,新的任务进去等待状态,直到前面任务执行完毕.
- tomcat闪退的解决思路
用Tomcat总会遇到启动Tomcat闪退的问题. 什么叫闪退啊,就是闪一下,就退出了控制台. 都闪退了,为啥闪退也不知道呀,又没有错误信息,所以就要先阻止闪退,先看到错误信息,知道启动不起来的原因. ...
- WPF Properties中Settings使用方式
Settings位于Properties中 代码上看Setting是一个单例模式 其中可以编写属性,方法 因为Setting位于窗口类之前实例化,所以通常用来窗口的某些设置,绑定. --------- ...
- 【06】Kubernets:资源清单(控制器 - Deployment)
写在前面的话 上一节主要简单的提了一下控制器都有哪些常用的,并且简单的功能是啥,最后一并提了 ReplicaSet 控制器. 但是 ReplicaSet 一般不需要我们直接配置,多以从本节开始,开始学 ...
- .Net工具类--表达式目录树解析DataReader和DataTable
一.概述 在项目中经常会使用SQL去操作数据库,在读取数据的时候返回结果一般是DataReader和DataSet,其中DataaSet里面可以包含多个DataTable. 读取到数据之后,一般情况下 ...
- Sql 分页语句
select * from (select *,ROW_NUMBER()over(order by [ID]) as rowindex from product ) tb where rowinde ...
- 阿里云 centos 无法执行moodle cron
在阿里云服务器安装moodle时,在执行cron计划任务时,报错sendmail: fatal: parameter inet_interfaces: no local interface found ...
- Spring事件监听机制
前言 Spring中的事件机制其实就是设计模式中的观察者模式,主要由以下角色构成: 事件 事件监听器(监听并处理事件) 事件发布者(发布事件) 首先看一下监听器和发布者的接口定义 public int ...
- .net Redis分布式锁,Dictionary,ConcurrentDictionary 介绍
1.背景 在计算机世界里,对于锁大家并不陌生,在现代所有的语言中几乎都提供了语言级别锁的实现,为什么我们的程序有时候会这么依赖锁呢?这个问题还是要从计算机的发展说起,随着计算机硬件的不断升级,多核cp ...