关闭

c++类的静态成员踩坑记录

标签: c++静态成员静态常量conststatic
772人阅读 评论(0) 收藏 举报
分类:

今天在静态成员上踩坑不少,特此记录。

c++类的静态成员需要在类内声明,而在类外进行定义,如下

class M
{
public:
    static int m;
};
int M::m = 90;
int main()
{
    cout<<M::m;
}

类内静态常量可以在类内直接初始化,如下,当然也可用上面的方法

class M
{
public:
    const static int m = 9;
};

int main()
{
    cout<<M::m;
}

类内静态常量数组的定义

class M
{
public:
    const static int m[];//声明
    M()
    {
        cout<<m[2]<<endl;
    }
};

const int M::m[8]={0,9,8,8};//定义

int main()
{
    M m = M();
}

那么问题来了,可不可以直接定义呢?静态常量数组也是常量啊,当然可以

class M
{
public:
    static const int m[] = {2,3,4};
    M()
    {
        cout<<m[2]<<endl;
    }
};

int main()
{
    M m = M();
}

如果你把上面代码copy或者敲下来编译会发现有个错误:
In-class initializer for static data member of type ‘const int [78]’ requires ‘constexpr’ specifier
大概意思是:const int [ 3 ]的静态数据成员初始化需要constexpr类
为什么呢?
因为const只表明这个变量是的值是不变的,但并没表明该变量需要在编译期确定,巧的是,数组就恰恰需要在编译期确定,而constexpr,则表明这个值不仅是值不变的,而且也是编译期确定的。
那好,我们改

class M
{
public:
    static constexpr int m[] = {2,3,4};
    M()
    {
     //   cout<<m[2]<<endl;  注意这句注释,往下看
    }
};

int main()
{
    M m = M();
}

没错,编译是成功的,那么,把上面的注释去掉呢,铛,两个错误来袭。。。
clang: error: linker command failed with exit code 1 (use -v to see invocation)
链接器命令失败,退出码1(使用- v查看调用)
“M::m”, referenced from:

查了好多问答文章,没有找到此错误原因,回过头再看书(c++primer),看到这样一段话:

class A {
static constexpr int p = 30;
double d[p];
};
如果某个静态成员的应用场景仅限于编译器可以替换它的值的情况,则一个初始化的const或constexpr static不需要分别定义。相反,如果我们将它用于值不能替换掉应用场景中,则该成员必须有一条定义语句。

显然,静态常量数组的元素是不能被替换掉的,所以。。。

class M
{
public:
    static constexpr int m[] = {2,3,4};
    M()
    {
        cout<<m[2]<<endl;
    }
};

constexpr int M::m[];//如果在类的内部提供了一个初始值,
                    //则成员的定义不能再指定一个初始值了

int main()
{
    M m = M();
}

以上,就是今一下午踩坑的收获,刚出坑,脚下难免有泥,若有错误,欢迎批评指正!

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C++ 类的静态成员详细讲解

在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节...
  • MoreWindows
  • MoreWindows
  • 2011-08-26 18:19
  • 87476

类的静态成员函数和静态成员变量的使用

C++类静态成员与类静态成员函数       当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本...
  • clc4210408
  • clc4210408
  • 2011-09-14 20:07
  • 50692

类的静态成员

静态成员的特性:       不管这个类创建了多少个对象,而其静态成员只有一个拷贝(副本),这个拷贝被所有属于这个类的对象共享。 一、静态数据成员       ...
  • candyliuxj
  • candyliuxj
  • 2009-09-04 21:45
  • 4950

C++类中的静态成员变量和静态成员函数的作用

数据成员可以分为静态变量、非静态变量两种。 静态成员:静态
  • kerry0071
  • kerry0071
  • 2014-05-14 18:22
  • 23453

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

原地址:http://blog.csdn.net/clc4210408/article/details/6775824 C++类静态成员与类静态成员函数       当将类的某个数据成员声明...
  • wuhen334360
  • wuhen334360
  • 2015-07-10 17:46
  • 7041

C++函数调用之静态成员函数

首先,定义如下类A: class A { private: static int val_s; public: static int getVal(){cout << "call ge...
  • C12345SDN
  • C12345SDN
  • 2014-09-06 11:27
  • 2685

实验4 含有类的静态成员与类的友元的C++程序设计

  • 2011-12-25 15:44
  • 18KB
  • 下载

全局数据管理—使用C++类的静态成员取代全局数据

  • 2007-10-10 20:00
  • 78KB
  • 下载

C++静态成员、友元函数、类模板实验

  • 2012-03-28 11:15
  • 216KB
  • 下载

C++ 静态成员变量 嵌套类分配回收内存

  • 2013-04-28 17:32
  • 1KB
  • 下载
    ~~~
    欢迎访问我的新博客地址:shiyi.fightcoder.com
    有问题,可以发邮件到 shiyi19960604@qq.com ,不要私信了,以后大概不太登csdn了。
    个人资料
    • 访问:244861次
    • 积分:4194
    • 等级:
    • 排名:第8517名
    • 原创:166篇
    • 转载:8篇
    • 译文:0篇
    • 评论:86条
    博客专栏
    最新评论