C++/Java__中类模板中的静态成员变量和静态成员函数

C++:

类模板实例化的每个模板类(每个模板类指的是对于声明时候对模板指定的类型,如List<int>,List<double>中的int,double.)都有自己的类模板静态数据成员,该模板类的所有对象,共享一个静态数据成员。

Tips:

(重要)1.模板类的静态数据成员应在文件范围内初始化。(包含模型)

(重要)2.每个模板类有自己的类模板的静态数据成员和成员函数副本。

 1.2详见《C++Templates》


示例代码:

#include <iostream>
using namespace std;

template < typename T >
class Test
{
public:
	Test(T num){
		k += num;
	}
	Test(){
		k += 1;
	}
	static void incrementK()
	{
		k += 1;
	}
	static T k;
};

template<typename T>
T Test<T>::k = 0;

int main()
{
	//static Field
	Test<int> a;
	Test<double> b(4);
	cout << "Test<int>::k  -->  " << a.k << endl;
	cout << "Test<double>::k  -->  " << b.k << endl;
	Test<int> v;
	Test<double> m;
	cout << "Test<int>::k  -->  " << Test<int>::k << endl;
	cout << "Test<double>::k  -->  " << Test<double>::k << endl;

	//static Function
	cout << endl;
	Test<int>::incrementK();
	cout << "After invoke Test<int>::incrementK()  Test<int>::k --> " << Test<int>::k << endl;
	Test<double>::incrementK();
	cout << "After invoke Test<double>::incrementK()  Test<double>::k --> " << Test<double>::k << endl;

	return 0;
}

测试输出:

C++/Java__中类模板中的静态成员变量和静态成员函数_第1张图片







Java:

1、对于Java来说并不存在泛型类,List<String> l1和 List<String> l2会被当成一个类进行处理①测试程序如下,也没有实例化的类生成额外的.class文件。

2、不管为泛型的参数传入何种实参,他们依旧被当做同一个类,因此在静态方法,静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。



①测试程序:

import java.util.ArrayList;
import java.util.List;

public class A3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Integer> l1List = new ArrayList<>();
		List<String> l2List = new ArrayList<>();
		System.out.println(l1List.getClass() == l2List.getClass());
	}

}
输出:




试图在泛型类中定义静态变量,导致编译错误:

public class R<T> {
	static T info;
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}


错误:

C++/Java__中类模板中的静态成员变量和静态成员函数_第2张图片

你可能感兴趣的:(泛型,模板类)