C++11类内static成员变量声明与定义
众所周知,将一个类内的某个成员变量声明为static型,可以使得该类实例化得到的对象实现对象间数据共享。
在C++中,通常将一个类的声明写在头文件中,将这个类的具体定义(实现)写在cpp源文件中。
因此,就引出了static成员变量的声明与定义问题:
1. 如果一个类内成员变量是static的,且需要将之设定为常量(const),那么这个变量声明与初始化均可写在头文件内。
举个例子:
// Scanner.hpp
class Scanner {
public:
const static int MAX_SIZE = 0xFFFF;
...
};
这里直接将MAX_SIZE声明与定义写在了头文件。这很好理解,编译器在为这个类分配内存空间的时候,已经知道了这个类内变量无需为每个对象“拷贝”一份(因为它是static的),并且又知道了它在程序运行过程中的值保持不变(因为它是const的),那么就可以直接将其处理。因此头文件内的类声明实现信息已经足够,从而这样的写法是合理的。
需要注意的是,不能在头文件内声明const static成员变量,而在具体源cpp文件内实现其初始化。因为这样编译器需要根据具体的实现文件来确定该成员变量的初始值,若实际应用中没有相应的实现文件(源cpp文件)来对这个成员变量实现初始化,则编译器无法明确意图,从而无法完成编译。
2.如果一个类内成员变量是static的,但不需要将其设定为常量(const),那么这个变量声明于头文件内,初始化(定义/实现)写在对应的cpp源文件中。
举个例子:
// Scanner.hpp
class Scanner {
public:
static int line;
...
};
// Scanner.cpp
#include "Scanner.hpp" int Scanner::line = ;
...
这样的实现方式给了类实现者一种相对的自由。这样就可以针对不同的实现文件实现不同的类内static字段初始化。
比如有两个Scanner实现文件: Scanner1.cpp 和 Scanner2.cpp,那么这两个源文件分别#include "Scanner.hpp",就可以分别实现各自的类内line值初始化。当然,在实际应用时,切不可同时使用Scanner1和Scanner2,因为这样会发生符号表重定义冲突(因为两个cpp文件均实现了Scanner,符号表内重复填充属性字段)。
需要注意的是,此时不能将上述line的初始化写在头文件(Scanner.hpp)里。道理类似,因为编译器发现这个字段并不是const的,也就是说这个字段可以被不同的实现文件(cpp文件)来具体确定其初始值,那么编译器就不负责在声明阶段对其实现初始化,因此在头文件内初始化一个类内非const的static成员变量是非法的。
C++11类内static成员变量声明与定义的更多相关文章
- 类的static成员变量和成员函数能被继承吗
1. 父类的static变量和函数在派生类中依然可用,但是受访问性控制(比如,父类的private域中的就不可访问),而且对static变量来说,派生类和父类中的static变量是共用空间的,这点 ...
- c++ 类内static成员初始化
类内部的static成员,除了为const static 且为整数类型(int char bool)可在类内部初始化. 其他的都建议在对应的cpp文件中进行初始化. test.h #ifndef TE ...
- 【C++】const,static和static const类型成员变量声明及其初始化
1)const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间 void f1() { ; cout<<x<<endl; ...
- static 成员变量、static 成员函数、类/对象的大小
一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...
- C++ static、const和static const类型成员变量声明以及初始化
C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. sta ...
- android 20 Intnet类重要的成员变量
Intnet类重要的成员变量: <intent-filter> <action android:name="android.intent.action.MAIN" ...
- 测试 Java 类的非公有成员变量和方法
引言 对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的 ...
- C++中的static 成员变量的一些注意点
C++中的static成员变量主要用来为多个对象共享数据 例: #include <iostream> using namespace std; class Student{ public ...
- java static成员变量方法和非static成员变量方法的区别
这里的普通方法和成员变量是指,非静态方法和非静态成员变量首先static是静态的意思,是修饰符,可以被用来修饰变量或者方法. static成员变量有全局变量的作用 非static成员变量则 ...
随机推荐
- putty上传下载文件
一,需要pscp.exe,习惯上和Putty.exe文件放在一起. 首先需要保证在命令行下可以访问到pscp.exe.可以通过配置Windows的环境变量Path,或者直接通过命令行访问到pscp.e ...
- N个数求和(PTA)
这题多输出了一个空格,卡了半天... leetcode刷多了,后遗症 这题可以用scanf("%lld/%lld"),直接读入,不过我用了stoll,也就是stoi,string ...
- C语言传递二维数组
方法一, 形参给出第二维的长度. 例如: #include <stdio.h> ] ) { int i; ; i < n; i++) printf("/nstr[%d] = ...
- tp5的输入和验证
规则和模板 好像要写一样名字,只需要引入模板
- pandas read excel or csv
import pandas as pd """pandas doc:df.dtypes 查看数据每column 数据类型 id int64x0 float64df.rei ...
- 解决IE8不兼容 background-size
IE8下,使用background-size适应盒子大小时不兼容,效果如下图: 网上找资料,说添加如下代码可以兼容IE8 filter: progid:DXImageTransform.Microso ...
- css 属性值 calc (目前只了解部分)
移动端页面,有如下图的需求: 实现效果: 实现 css 代码: .list {/*父级*/ border: 1px solid #E9EAEA; border-radius: 2px; backgro ...
- Java常用API——Arrays工具类
介绍:Arrays工具类提供了一些可以直接操作数组的方法,以下是一些常用方法: int binarySearch(type[] a, type key):要求数组a元素升序排列,使用二分法搜索key的 ...
- logback.xml设置mogodb日志打印控制台
<logger name="org.springframework.data.mongodb.core" level="DEBUG"/>
- Spring Boot 使用 JAX-WS 调用 WebService 服务
除了 CXF 我们还可以使用 Spring Boot 自身默认的组件 JAX-WS 来实现 WebService 的调用. 本项目源码 github 下载 1 新建 Spring Boot Maven ...