• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ 静态成员的类内初始化详解及实例代码

C++ 静态成员的类内初始化详解及实例代码

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++ 静态成员初始化,c++静态成员函数,c++静态数据成员,c++静态成员变量,c++静态成员等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C++ 静态成员的类内初始化详解及实例代码

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

我们来看如下代码:

//example.h
#include<iostream>
#include<vector>
using namespace std;

class Example{
public:
  static double rate = 6.5;
  static const int vecSize = 20;
  static vector<double> vec(vecSize);
};

//example.cpp
#include "example.h"
double Example::rate;
vector<double> Example::vec;
</div>

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

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

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

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
</div>

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中添加测试代码进行测试了:

#include "example.h"
vector<double> Example::vec(Example::vecSize);
constexpr const double Example::rate;

int main(){

  Example::vec.push_back(10.5);
  cout << Example::vec.back() << endl;
  cout << Example::rate << endl;
  cout << Example::vecSize << endl;
}
</div>

执行结果:

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

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++ 静态成员的类内初始化详解及实例代码
  • 关于C++中构造函数初始化成员列表的总结
  • 关于C++类的成员初始化列表的相关问题
  • C++利用静态成员或类模板构建链表的方法讲解
  • 深入解析C++编程中的静态成员函数
  • C++中COM组件初始化方法实例分析
  • C++ 类的静态成员深入解析

相关文章

  • 2017-05-28C++设计模式之中介者模式
  • 2017-05-28简介C++编程中的运算符重载
  • 2017-07-23《Objective-C高级编程》干货三部曲(一):引用计数篇
  • 2017-05-28C语言之单链表的插入、删除与查找
  • 2017-05-28C++运算符重载 成员函数与友元函数详解
  • 2017-05-28在Visual Studio中用C++语言创建DLL动态链接库图文教程
  • 2017-05-28C++封装远程注入类CreateRemoteThreadEx实例
  • 2017-05-28C++中赋值运算符与逗号运算符的用法详解
  • 2017-05-28MFC扩展DLL中导出类和对话框的实现方法
  • 2017-05-28C语言实现统计字符串单词数

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c++学习之构造函数
    • 由static_cast和dynamic_cast到C++对象占用内存的全面分析
    • C++判断矩形相交的方法
    • C语言 选择排序算法详解及实现代码
    • C语言 经典题目螺旋矩阵 实例详解
    • C语言socket编程开发应用示例
    • 素数判定算法的实现
    • C语言变量类型与输出控制用法实例教程
    • C语言编写Linux守护进程实例
    • C语言中的文件是什么?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有