关闭

c++中静态成员变量要在类外部再定义,否则产生link2001错误

标签: 魔法C++
160人阅读 评论(0) 收藏 举报
分类:
c++中静态成员变量要在类外部再定义,否则产生link2001错误.

class testClass
{
  public:
  static int m_i;
};

// 类外部定义,若不写会产生
// error LNK2001: unresolved external symbol "public: static int testClass::m_i" (?m_i@testClass@@2HA)
int testClass::m_i;

int main(int argc, char* argv[])
{
  printf("%d\n",testClass::m_i);
  printf("\n");
  return 0;
}

为什么要在类的外部进行定义的原因:
1. 在类中,只是声明了静态变量,并没有定义。
2. 声明只是表明了变量的数据类型和属性,并不分配内存;定义则是需要分配内存的。
   注意:如果在类里面这么写int a; 那么是既声明了变量,也定义了变量,两者合在一起了。
3. 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“对象(实例)级别”的。
   类级别的成员,先于该类任何对象的存在而存在,它被该类所有的对象共享。
4. 现在,咱们假定要实例化该类的一个对象,那么会发生什么事情呢?
   静态成员肯定要出现在这个对象里面的,对吧?这时候才去定义那个静态成员吗?这显然是不合适的。
   因为,比如有另外一个线程也要创建该类的对象,那么也要按照这个方式去定义那个静态成员。
   这会产生两种可能的情况:
      A. 重复定义;
      B. 就算不产生重复定义的情况,也会产生竞争,从而造成死锁的问题,以至于对象无法创建。
         很显然,编译器不能这么干。那么很合理的解决办法,就是事先在类的外部把它定义好,然后再供所有的对象共享。
         当然这样做,还是有可能产生线程安全的问题,但不管怎么说对象是创建好了,而这种线程安全问题,可以在编程中予以解决。


对于class的static data member,其实只是声明了一个scope(还记得class::static_data_member中的::么?),
既然是声明而已,所以还需要一个定义,
之所以需要在类的外面,因为本质来说它和global和static变量没什么区别,都是在数据段的,只是scope不一样,属于class而已。

这里反映出了C/C++里面一些稍微偏底层的复杂的细微的概念,比如scope,storage,life time。
::是指scope,是在class里面声明的,
static指storage,是和global一样,在外面定义的。
0
0
查看评论

c++中静态成员变量要在类外部再定义,否则产生link2001错误

class testClass { public: static int m_i; }; //类外部定义,若不写会产生error LNK2001: unresolved external symbol "public: static int testClass::m_i&...
  • michel27
  • michel27
  • 2013-04-01 13:40
  • 373

c++中静态成员变量要在类外部再定义,否则产生link2001错误.

c++中静态成员变量要在类外部再定义,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved ...
  • zhanghuaichao
  • zhanghuaichao
  • 2016-12-09 09:48
  • 156

c++中静态成员变量要在类外部再定义,否则产生link2001错误

c++中静态成员变量要在类外部再定义,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved ...
  • fireroll
  • fireroll
  • 2014-01-10 15:16
  • 691

c++中静态成员变量要在类外部再定义或初始化的原因

,否则产生link2001错误. class testClass {   public:   static int m_i; }; // 类外部定义,若不写会产生 // error LNK2001: unresolved external symbol "publi...
  • icandoit2010
  • icandoit2010
  • 2016-12-09 17:20
  • 4361

【C++基础之一】静态变量的分配空间与LNK2001错误

今天写一个单例类,在使用静态变量的时候发现了一个之前没有注意到的问题,这里总结并记录一下。 先看这个单例类: Singleton.h #pragma once class CSingleton { public: CSingleton(void); ~CSingleton(void); st...
  • jackyvincefu
  • jackyvincefu
  • 2013-09-09 09:05
  • 5943

类的static变量 连接时,提示无法解析的外部符号

问题: 在类MyClass.h中定义一个static成员    static QVector m_vecXmlDe; 当在其他类中引用该成员时m_vecXmlDe.pushback(i),会提示m_vecXmlDe无法解析的外部符号。 原因: 没有初始化该静态成员。 解...
  • wen_eric
  • wen_eric
  • 2015-07-06 13:26
  • 1758

【C++】类的静态成员函数和静态成员变量的使用

原地址:http://blog.csdn.net/clc4210408/article/details/6775824 C++类静态成员与类静态成员函数       当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而...
  • wuhen334360
  • wuhen334360
  • 2015-07-10 17:46
  • 7114

关键字static的作用是什么? C++类中的静态成员变量和静态成员函数的作用

本文转自《面试宝典》 1,函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时,仍维持上次的值;
  • taotaoah
  • taotaoah
  • 2016-10-17 22:12
  • 1573

C++ static 静态成员变量 和 静态成员函数

static 静态 成员 变量 和 静态 成员 函数。
  • u013630349
  • u013630349
  • 2015-06-08 16:07
  • 990

Android全局异常捕捉器

Android全局异常捕捉器主要是捕获应用在运行中无法预计的异常 1.首先要写一个MyCrashHandler实现UncaughtExceptionHandler package com.example.testuncaughtexceptionhandler; import java.l...
  • typhoonhuan
  • typhoonhuan
  • 2013-09-24 13:31
  • 999
    个人资料
    • 访问:8610次
    • 积分:469
    • 等级:
    • 排名:千里之外
    • 原创:38篇
    • 转载:12篇
    • 译文:0篇
    • 评论:0条