C++ 静态成员的类内初始化

PLUS模型土地利用变化模拟使用简介 因子包括自然因子如社会因子,通过计算整理得到新图层,并以tif文件输出到驱动因子的文件夹里,驱动因子文件夹里存放的是tif文件格式。线性回归使用提供的所有的LULC资源数据,可以选择往后预测的年数,选择好数据之后,可以得出预测的每一年的每一用地类型面积数据。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。在此过程之后,可以继续使用此CARS输入的数据继续模拟,也可返回二(3)中CARS模块,重新输入不同的年份预测。 阅读详情

C++ 静态成员的类内初始化

一般来说,关于C++类静态成员的初始化,并不会让人感到难以理解,但是提到C++ 静态成员的"类内初始化"那就容易迷糊了。

我们来看如下代码:

 1 //example.h
 2 #include<iostream>
 3 #include<vector>
 4 using namespace std;
 5 
 6 class Example{
 7 public:
 8     static double rate = 6.5;
 9     static const int vecSize = 20;
10     static vector<double> vec(vecSize);
11 };
12 
13 //example.cpp
14 #include "example.h"
1516 double Example::rate;
17 vector<double> Example::vec;
 

 

我们需要判断上面的静态数据成员的声明和定义有没有错误,并解释原因。

首先,要谨记:通常情况下,不应该在类内部初始化成员,无论是否为静态成员。

其次,若一定要在类内初始化静态成员,那么就必须满足如下条件才行:

1) 静态成员必须为字面值常量类型的constexpr。

      所谓的字面值类型就是通常遇到的:算术类型,引用,指针等。字面值常量类型就是const型的算术类型,引用,指针等。

      所谓的constexpr,就是常量表达式,指值不会改变且在编译过程中就能得到计算结果的表达式。比如字面值,或者用常量表达式初始化的const对象也是常量表达式。为了帮助用户检查自己声明/定义的变量的值是否为一个常量表达式,C++11新规定,允许将变量声明为constexpr类型,以便由编译器来进行验证变量是否为常量表达式。

2)给静态成员提供的初始值,必须为常量表达式

注意:在C++ primer 第五版中说:只能给静态成员提供const 整数类型的类内初始值,且该const整数类型的初始值必须是常量表达式。我觉得是有误的!详情见后面分析。

 

有了这两条原则,我们就可以对上面的代码进行验证了。

1)static double rate = 6.5; 

显然不满足第一条:因为rate不是常量类型。改成constexprt static const double rate = 6.5即可

从这里也可以看出初始值不一定必须为const 整数类型。

ps: 如果我们不再这里加入constexprt修饰符的话,编译器会提示错误:error: ‘constexpr’ needed for in-class initialization of static data member ‘const double Example::rate’ of non-integral type [-fpermissive] 
大体意思就是,对于非const整数类型的初始值,如果它是常量表达式的话,我们需要手工在前面添加修饰符constexprt。

至于Example.cpp文件中的定义部分,由于我们已经在类内部进行了初始化,就不需要再在类外部进行定义了。如果非要定义的话,必须采用如下格式:

//example.cpp

constexpr const double Example::rate;  //其中的const是可以删除的,因为constexprt本身就包含了const

2)static const int vecSize = 20;

vecSize是const int类型的,且为常量表达式——满足第一条;提供的初始值为20,是一个常量表达式——满足第二条!且由于是const int型的,前面可以不用修饰符constexpr。

3)static vector<double> vec(vecSize);

错误!vector是模板不是字面值常量类型,所以不满足第一条。应该改为 static vector<double> vec; //仅仅且只能进行声明,不能定义

然后在Example.cpp中进行定义:

static vector<double> vec(Example::vecSize);

现在我们可以在Example.cpp中添加测试代码进行测试了:


 1 #include "example.h"
 2 vector<double> Example::vec(Example::vecSize);
 3 constexpr const double Example::rate;
 4 
 5 int main(){
 6 
 7     Example::vec.push_back(10.5);
 8     cout << Example::vec.back() << endl;
 9     cout << Example::rate << endl;
10     cout << Example::vecSize << endl;
11 }

 

 

执行结果:

 

wanchouchou@wanchouchou-virtual-machine:~/c++/7.5$ ./Example 
10.5
6.5
20

文章来源:https://www.cnblogs.com/wanyuanchun/p/4041080.html

 

Howland电流源电路:从理论到实践的深度解析与优化策略 本文深度解析了Howland电流源电路的工作原理,从经典四电阻架构的“虚短”“虚断”分析,到其实现宽带恒流输出的理论优势。重点剖析了实践中因电阻精度、运放参数及PCB布局导致的性能瓶颈,并提供了引入第五电阻、优化运放选型等关键优化策略,旨在将输出阻抗从kΩ级提升至MΩ级,以满足精密测量与传感器驱动等应用需求。 阅读详情

相关推荐

Lumerical FDTD新手教程:5步搞定MMI波导光谱模拟(附避坑指南)

本文提供Lumerical FDTD新手教程,详细讲解5步完成MMI波导光谱模拟的实用方法,包括环境准备、结构建模、光源配置、仿真优化和结果分析。特别针对多模干涉耦合器(MMI)的模拟难点,提供避坑指南和优化策略,帮助光学工程师快速掌握FDTD仿真技术。

kite3的博客 359

static成员必须在类外初始化

转:http://www.cnblogs.com/graphics/archive/2010/07/16/1778743.html 为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样 class A { private: sta

veryday_code的专栏 2万+

ESP32-CAM入门教程

ArduinoESP32-CAM下载模块(接上USB就能用,很方便,如果没有买就只有资金用USB-TTL了)如下图两个合在一起如下图。

qq_48778364的博客 3万+

静态成员变量的初始化

我们定义如下类: 复制代码 //A.h class A { private: static const int m = 5; static int n; static vector buf; }; 复制代码 其中包含三个私有的静态类成员,C++规定const静态类成员可以直接初始化,其他非const的静态类成员需要在类声明以外初始化,我们一般选择在类的实

fxc_fxc的博客 3768

MQTT阿里云OTA 调试记录

2.验证,这个验证是什么意思呢,就是阿里云会把你包的信息,比如包大小,streamid(相当于包的识别码),版本号发送给你的设备,然后如果你没发送升级成功的包给阿里云,这里会是一直验证中的状态,那你的设备每次重新连接阿里云,发送connect包给阿里云的时候,阿里云就会发送一次这个验证(upgrade)包。提取到了之后就可以发送请求包了,这个请求包比较坑,也可能是我没付费,他的包一次最多只有1024个字节的数据。之前说了,验证状态下,设备发送connect包给阿里云,阿里云就会发一个upgrade包给你。

qq_42585211的博客 1231

Halcon手眼标定实战:从九点标定到机械臂精准抓取(附完整代码)

本文详细介绍了Halcon手眼标定技术在实际工业场景中的应用,重点讲解了九点标定法在机械臂精准抓取中的实现步骤和优化技巧。通过对比Eye-to-Hand和Eye-in-Hand两种模式的特点,提供完整的代码示例和误差分析,帮助工程师快速掌握标定技术,提升自动化系统的精度和稳定性。

weixin_29100927的博客 460

c++的静态数据成员初始化方法

类的静态成员变量初始化应该在类外进行 注意,不能在头文件初始化,只能在cpp文件中初始化,如果在声明中初始化, 在其它地方引用时相当于多次定义。 静态数据成员的使用方法和注意事项如下: 1、静态数据成员在定义或说明时前面加关键字static。//静态变量的定义 2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:     <数据类型><类名>::&l...

EricLee23 1万+

Captcha must be filled out,解决Kaggle新用户注册无法弹出验证提示的问题

Captcha must be filled out

weixin_46713695的博客 5万+

面试题: C++类内静态成员必须在类外初始化吗? --分析与示例

-

zorchp 2297

【VoxCPM2】在Windows上从零搭建VoxCPM2 语音生成和语音克隆AI算法

建议你了解清楚VoxCPM2,再来考虑是否需要自己在本地搭建。

AnChenliang_1002的博客 757

基于STM32设计的太阳能智慧路灯_444

本文设计并实现了一种基于 STM32 的太阳能智慧路灯系统。系统以 STM32F103C8T6 单片机为核心,集成温湿度检测、空气质量检测、环境光照检测、行人检测和路灯故障检测等功能,实现对路灯运行环境和工作状态的实时感知。

462

C++静态成员变量为什么要类外初始化

关于C++静态成员变量的知识点以及为什么必须在类外进行初始化

weixin_44115575的博客 1869

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++类静态成员的初始化

记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! #include iostream> using namespace std; class test { public: static int num; }; int test:

1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!! 复制代码 代码如下: #include using namespace std; class test { public: static int num; }; int test::nu

MTT_SKY 8309

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C++中,是不是所有的类的静态成员变量,都需要初始化

静态成员函数的实现应该像普通函数一样(只是在函数名前加上类名和::运算符来指定它属于哪个类),只是它们可以访问类的静态成员(变量和函数),但不能直接访问非静态成员(除非通过某个对象的指针或引用)。在C++中,类的静态成员函数(static member function)的声明需要在类定义中加上static关键字,以明确指出该函数是属于类本身而不是类的某个对象的。在C++中,并不是所有的类的静态成员变量都需要显式地初始化,但确实有一些重要的规则和注意事项与静态成员变量的初始化相关。

slty_123的博客 633

c++类中静态成员的初始化

使用c++时,我们有时会在类中设置静态成员,静态成员属于类,而不属于类具象化之后的某一对象。其初始化与一般类内成员有所区别。 方法一:类内初始化      要求静态函数是const或constexpr 类型的。例如,对于静态成员static int j; 如果采用static int j=10的初始化方法是错误的,需要保证j是常量表达式,应采用static constexpr int j=10的

hcyvan的专栏 1499

关于C++11静态成员变量的类内初始化

C++静态成员变量的类内初始化

Azahaxia的博客 2439

C++中类静态成员初始化的问题

在C++中静态成员只关联于类,而和类的具体对象不关联,类静态成员独立于任何一个对象而存在。特别的静态成员的类型可以是它所在的类,而非静态成员,而对于非静态成员则不行,非静态成员必须被声明为类对象的指针或者是引用。 class Bar { public: //.... private: static Bar mem1; //OK Bar *mem2; //OK Bar mem3; //ER

u013168727的专栏 1396

C++类的静态成员的初始化出现访问冲突、myhead nullptr错误

感觉静态成员要么是简单类型要么是指针比较好,不要是复杂类本身。

907

C++中关于类中常数静态成员初始化的问题

 申明, 本文由某论坛的一篇帖子整理.记住:通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化!!!#include iostream>using namespace std;class tes

WINCOL的专栏 2208

C++入门自学Day4-- c++类与对象(类的初始化和静态成员)

本文回顾了C++类与对象相关概念,重点介绍了初始化列表和静态成员。初始化列表比构造函数体内赋值更高效,且const成员、引用成员等必须使用初始化列表。静态成员属于类而非对象,需在类外初始化,可通过类名直接访问。静态成员函数无this指针,不能访问非静态成员,而非静态函数可访问静态成员。文章还通过两道面试题和OJ练习题(递归求和与类构造求和)展示了这些概念的实际应用,并提供了避免隐式转换的explicit关键字用法。总结部分以表格形式清晰对比了静态与普通成员的区别。

JJOHJHOUJ的博客 1496

C++ 类的静态成员变量为什么一定要初始化

我们知道C++类的静态成员变量是需要初始化的,但为什么要初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。两者的区别在于:初始化是赋一个初始值,而定义是分配内存。静态成员变量在类中仅仅是声明,没有定义,所以要在类的外面定义,实际上是给静态成员变量分配内存。可以通过以下几个例子更形象的说明这个问题: //test.cpp #i...

xupeng1644的博客 3009
上一篇: C++ 中 new 操作符内幕:new operator、operator new、placement new
下一篇: C++OO部分知识小结(1)
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值