当前位置: 首页 > news >正文

C++11(一):在类的定义时初始化非静态变量

前言

距离C++11标准发布时间大约有六年了,但是C++11的诸多特性并未在程序界达到普及的状态,甚至在一些“老程序员”看来,由于他们不了C++11标准新加入的内容,一些正常的程序常常被当做BUG处理,接下来我们就看看C++11加了那些特性,今天我们来测试一下:“在类的定义时初始化非静态变量”。不得不承认我在这一点上也犯过错误,我们一起来看一下。

测试环境

  • 操作系统:Windows 7 x64 Service Pack 1
  • 开发环境:Visual Studio 2008 (代表C++03)
  • 对比环境:Visual Studio 2015 (代表C++11)

测试内容

  • 在VS2008上的测试代码级编译结果(参考注释)
#include <iostream>
using namespace std;

// using c++03 standard
class CTest03
{
public:
    static const int a = 3; // Ok in C++03
    static int b = 4;       // Error
    const int c = 5;        // Error
    int d = 6;              // Error
public:
    CTest03():c(0) { }      // Ok in C++03
};

int main()
{
    CTest03 testObj;
    cout << testObj.a << testObj.b << testObj.c << testObj.d << endl;
    return 0;
}
  • VS2008编译结果

    error C2864: “CTest03::b”: 只有静态常量整型数据成员才可以在类中初始化
    error C2864: “CTest03::c”: 只有静态常量整型数据成员才可以在类中初始化
    error C2864: “CTest03::d”: 只有静态常量整型数据成员才可以在类中初始化

  • 在VS2015上的测试代码级编译结果(参考注释)

// using c++11 standard
class CTest11
{
public:
    static const int a = 3; // Ok in C++11
    static int b = 4;       // Error
    const int c = 5;        // Ok in C++11
    int d = 6;              // Ok in C++11
public:
    CTest11() :c(0) { }     // Ok in C++11
};

int main()
{
    CTest11 testObj;
    cout << testObj.a << testObj.b << testObj.c << testObj.d << endl;
    return 0;
}
  • VS2015编译结果
    error C2864: “CTest11::b”: 带有类内初始值设定项的静态 数据成员 必须具有不可变的常量整型
    note: 类型是“int”

总结

根据上述的代码和编译结果,以及实际的操作调试发现

  • 对于static const 类型的成员变量不管是旧的C++标准还是C++11都是支持在定义时初始化的。
  • 对于static 非const类型的成员变量C++03和C++11的标准都是不支持在定义时初始化的。
  • 对于const 非static类型的成员变量C++03要求必须在构造函数的初始化列表中来初始化,而C++11的标准支持这种写法,同时允许在定义时进行初始化操作。
  • 对于非static 非const成员变量,C++03标准不允许在成员变量定义时初始化,但是C++11标准允许在类的定义时对这些非静态变量进行初始化
  • 对于static非const成员变量的初始化方式并未改变,就是在相应的cpp文件中写成int CTest11::b = 5即可,注意要在类定义之后。

相关文章:

  • C++11(二):lamda表达式
  • 可能错误使用了‘offsetof’宏
  • 警告:对 NULL 对象非静态数据成员‘XXX::xxx’的访问无效
  • git tag常用操作
  • error: SEH exception with code 0xc0000005 thrown in the test
  • new对象数组是否会调用对象的构造函数
  • const究竟限制了谁的改变
  • CSDN 论坛板块升级规则
  • poj解题报告——序
  • UE4编辑器修改界面显示语言
  • poj解题报告——poj 2028 When Can We Meet?
  • poj解题报告——poj 1493 Machined Surfaces
  • poj解题报告——poj 2365 Rope
  • poj解题报告——poj 2575 Jolly Jumpers
  • poj解题报告——poj 3536 Beer Refrigerator
  • 3.7、@ResponseBody 和 @RestController
  • es的写入过程
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • JavaWeb(学习笔记二)
  • Logstash 参考指南(目录)
  • Otto开发初探——微服务依赖管理新利器
  • SpringBoot 实战 (三) | 配置文件详解
  • SQLServer之索引简介
  • 前端攻城师
  • 前嗅ForeSpider中数据浏览界面介绍
  • 区块链将重新定义世界
  • 使用common-codec进行md5加密
  • 树莓派 - 使用须知
  • 算法---两个栈实现一个队列
  • 算法系列——算法入门之递归分而治之思想的实现
  • 以太坊客户端Geth命令参数详解
  • Nginx实现动静分离
  • Python 之网络式编程
  • 扩展资源服务器解决oauth2 性能瓶颈
  • #if #elif #endif
  • #中的引用型是什么意识_Java中四种引用有什么区别以及应用场景
  • $forceUpdate()函数
  • (待修改)PyG安装步骤
  • (转)Mysql的优化设置
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 8.0 中有哪些新的变化?
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET建议使用的大小写命名原则
  • .NET连接MongoDB数据库实例教程
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • /var/log/cvslog 太大
  • [ vulhub漏洞复现篇 ] Apache Flink目录遍历(CVE-2020-17519)
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [.net] 如何在mail的加入正文显示图片