VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1590|回复: 5

C++primer 上的一句话,怎么如此难以理解!

[复制链接]

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-3-15 13:00:02 | 显示全部楼层 |阅读模式
下面这句话哪位牛人给解释下

在类体内初始化一个const 静态数据成员时该成员必须仍然要被定义在类定义之外
但是因为这个静态数据成员的初始值是在类体中指定的所以在类定义之外的定义不能指定初始值

回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-6-13 13:45:01 | 显示全部楼层
你写段代码试一下嘛。
回复

使用道具 举报

0

主题

63

帖子

43.00

积分

新手上路

Rank: 1

积分
43.00
发表于 2020-6-13 21:15:01 | 显示全部楼层
class foo {
static const int a = 5;
}
const int foo::a;
回复

使用道具 举报

1

主题

6

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
 楼主| 发表于 2020-6-14 12:00:02 | 显示全部楼层
thanks
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-6-15 17:45:01 | 显示全部楼层
静态数据成员不属于类对象,而是全部类对象所共有,你可以的这么的理解:
静态数据成员独立于类的一个对象,它的定义(分配存储区域)不是定义类对象时进行的,而是独立进行的,
而类定义本身不分配存储区,只是引入一个类型名字(类类型),所以必需在类定义的外面定义它,这是才分配内存给静态数据成员
class A
{
public:
        static int i;
};

int main()
{
        cout << A::i;
        return 0;
}
你这么写会发现i根本不存在

class A
{
public:
        static int i;
};

int A::i =10;

int main()
{
        cout << A::i;
        return 0;
}
这样就可以了
至于初始值,
在类定义的时候指出和类外实际定义的时候
给出只能用一个,我上面的例程,是在实际定义的时候给初始值的
否则编译器怎么知道到底用哪个去初始化
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-1 18:00:01 | 显示全部楼层
我发现C++ prime 上的这句话好像时错误的
在类体内初始化一个const   静态数据成员时该成员必须仍然要被定义在类定义之外
但是因为这个静态数据成员的初始值是在类体中指定的所以在类定义之外的定义不能指定初始值

我这样做在VC++ 6.0上却出现了错误
#include "stdafx.h"
#include<iostream>
using namespace std;
class   A
{
public:
static const int i=10;
};
const int A::i;
int   main()
{
cout<<A::i;
return   0;
}
那位高手能帮忙解释一下给我啊?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表