鱼C论坛

 找回密码
 立即注册
查看: 1048|回复: 2

[已解决]static

[复制链接]
发表于 2023-10-29 11:34:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
// example.h
#include <vector>

class Example {
public:
    static constexpr double rate = 6.5;
    static const int vecSize = 20;为什么这里没有定义,是它已经定义了,还是就没有定义?如果定义了他在哪?
    static std::vector<double> vec;
};

// example.cpp
#include "example.h"

constexpr double Example::rate;为什么这里需要定义?
std::vector<double> Example::vec(Example::vecSize);
难道只有整型的才不需要外部定义初始化吗?
最佳答案
2023-10-29 11:34:52
在C++中,静态成员变量的定义和初始化有一些特殊的规则。

对于整型的静态成员变量,如果在类定义中使用了常量表达式进行初始化,那么该静态成员变量就被视为已经定义了。在这种情况下,我们只需要在类定义外部提供一个定义即可,如示例中的 constexpr double Example::rate; 语句。

对于其他类型的静态成员变量,无论是否使用了常量表达式进行初始化,都需要在类定义外部提供一个定义。这是因为其他类型的静态成员变量需要分配内存空间,并且初始化的过程可能需要更多的操作,因此需要提供定义。

在示例中, vecSize 是一个整型静态成员变量,它在类定义中使用了常量表达式进行初始化,所以它被视为已经定义了。而 vec 是一个 std::vector<double> 类型的静态成员变量,所以需要在类定义外部进行定义和初始化。

总结起来,只有整型的静态成员变量在类定义中使用常量表达式进行初始化时,才被视为已经定义了,其他类型的静态成员变量都需要在类定义外部提供定义和初始化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-29 11:34:52 | 显示全部楼层    本楼为最佳答案   
在C++中,静态成员变量的定义和初始化有一些特殊的规则。

对于整型的静态成员变量,如果在类定义中使用了常量表达式进行初始化,那么该静态成员变量就被视为已经定义了。在这种情况下,我们只需要在类定义外部提供一个定义即可,如示例中的 constexpr double Example::rate; 语句。

对于其他类型的静态成员变量,无论是否使用了常量表达式进行初始化,都需要在类定义外部提供一个定义。这是因为其他类型的静态成员变量需要分配内存空间,并且初始化的过程可能需要更多的操作,因此需要提供定义。

在示例中, vecSize 是一个整型静态成员变量,它在类定义中使用了常量表达式进行初始化,所以它被视为已经定义了。而 vec 是一个 std::vector<double> 类型的静态成员变量,所以需要在类定义外部进行定义和初始化。

总结起来,只有整型的静态成员变量在类定义中使用常量表达式进行初始化时,才被视为已经定义了,其他类型的静态成员变量都需要在类定义外部提供定义和初始化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-29 11:35:20 | 显示全部楼层
在C++中,static关键字在类中的使用有特殊的含义。当我们在类中声明一个静态成员时,它实际上只是在类的范围内声明了一个全局变量,但并没有定义它。这就是为什么我们需要在类的外部定义它。

对于constexprconst的静态成员,情况有所不同。对于constexpr,它是在编译时就已经确定的,所以它不需要在类的外部再次定义。而对于const的整型静态成员,C++标准允许在类内部初始化,因此也不需要在类的外部定义。但是,对于非整型的const静态成员或者非const的静态成员(如std::vector<double> vec),它们需要在类的外部定义和初始化。

所以,对于你的问题:

1. static constexpr double rate = 6.5; 这里的rate已经在类内部定义和初始化了,所以不需要在类的外部再次定义。在你的代码中,constexpr double Example::rate;这行代码是多余的,可以删除。

2. static const int vecSize = 20; 这里的vecSize也已经在类内部定义和初始化了,所以不需要在类的外部再次定义。

3. static std::vector<double> vec; 这里的vec只是在类内部声明了,没有定义和初始化,所以需要在类的外部定义和初始化,即std::vector<double> Example::vec(Example::vecSize);

总的来说,不是只有整型的才不需要外部定义初始化,而是constexprconst的整型静态成员可以在类内部定义和初始化,而非整型的const静态成员或者非const的静态成员需要在类的外部定义和初始化。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 17:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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