C++之静态成员
来源:互联网 发布:商务部数据 编辑:程序博客网 时间:2024/05/18 09:13
C++静态成员包含静态数据成员和静态成员函数两部分。
1. 静态数据成员
C++中类的静态数据成员声明如下:
template<typename T>class Test{ ...... static T _staticVal; ...... };
和其它数据成员一样,静态数据成员也遵守public、protected、private访问规则。静态数据成员实际上是类作用域中的全部变量,其定义(或初始化)不应该被放在头文件中,定义方式类似于全局变量,如下:
template<typename T> T Test<T>::_staticVal=value;//假设value是T类型,并且赋值合法
C++标准规定,如果静态数据成员同时被const修饰,那么这个成员既可以在类内部初始化也可以在类外部初始化,如下:
template <typename T>class Test{ static const T _staticVal;};template<typename T> const T Test<T>::_staticVal=value;
或
template <typename T>class Test{ static const T _staticVal =value ;//假设赋值合法};
另外需要注意的是不要在类声明的头文件中定义静态数据成员,这样做容易引起重复定义的错误,即使加上#ifndef、#define、#endif、或者#pragma once也难避免。
静态数据成员被类及其派生类的所有对象共享,即派生类对象与基类对象共享基类的静态数据成员。
静态数据成员可以当做成员函数的默认参数,而普通数据成员则不行。如下:
template<typename T>class Test{ public: void fun1(T param=_staticVal1) {}//OK void fun2(T param=_Val2) {}//error static T _staticVal1; T _Val2;};
静态数据成员的类型可以是类类型,但是非静态数据成员的类型不能是类类型,只可以是类类型的引用或指针。
2.静态成员函数
首先,类的静态成员函数不含有this指针,因此静态成员函数不可以调用类的非静态成员,包括类的非静态数据成员和普通的成员函数。
静态成员函数不可以同时声明为virtual、const、volatile函数,如下:
template<typename T>class Test{ virtual static void fun1() {}//error static void fun2() const {} //error static void fun3() volatile {} //error};之前一直不知道的一个特点:静态成员函数的地址可以用普通函数指针来存储,而普通成员函数地址需要用类成员函数指针来存储。
template<typename T>class Test{public: void nostatic() {} static void staticfun() {}};void (*f1)()=&Test<int>::staticfun;void (Test<int>::*f2)()=&Test<int>::nostatic;int A::value=1;
3.关于const成员函数
const 成员函数用来保证函数不会改变对象的状态,在const成员函数中const修饰的是this指针,因此static数据成员在const成员函数中是可变的,另一方面,如果需要在const成员函数中修改某些与对象的状态无关的数据成员,那么这些数据成员就应该声明为mutable,在C++中mutable是为了突破const的限制而设置的。
0 0
- C++_静态成员
- C++_静态成员
- C++_静态成员
- C++【静态成员】
- [C++] 静态成员函数
- C++-静态成员
- C++---静态成员
- c++--静态成员变量
- C++之静态成员
- C++:静态成员与常成员
- C#—静态成员和实例成员
- C++static静态数据成员
- C++static静态成员函数
- C++---类中的静态成员
- 【C++】静态成员函数小结
- C++:静态类成员函数
- 【C++】类的静态成员
- C++——静态成员
- gcc 的 -g 和 -ggdb 选项
- 数据结构-----栈的实现
- myeclipse2014搭建maven项目
- 字符串系列之:逆序输出字符串
- 写给准备参加秋招的学弟学妹们~一定要来看哦~
- C++之静态成员
- 直接交换两个数
- Linux中nginx的源码安装
- 30_leetcode_Length of Last Word
- 两数交换
- 利用扩展事件监控死锁-图形用户界面
- 南阳27 水池数目(DFS+BFS)
- C#委托与事件
- 31_leetcode_ Insert Interval