C++学习笔记(3)----类模板的static成员
与任何其他类相同,类模板可以声明 static 成员:
template <typename T>
class Foo {
public:
static std::size_t count() {
return ctr;
}
void addctr() {
ctr++;
}
void subctr() {
ctr--;
}
private:
static std::size_t ctr;
// 下面可以有其他成员接口
};
template <typename T>
std::size_t Foo<T>::ctr = ; //定义并初始化 ctr
在这段代码中,Foo是一个模板类,它有一个名为 count 的 public static 成员函数和一个名为 ctr 的 private static 数据成员。每个 Foo 的实例都有自己的 static 成员实例。即,对任意给定类型X,都有一个Foo<X>::ctr 和一个 Foo<X>::count() 成员函数。所有 Foo<X>类型的对象共享相同的 ctr 对象和 count 函数。例如:
//实例化 static 成员 Foo<string>::ctr 和 Foo<string>::count
Foo<string> fs;
//所有三个对象共享相同的 Foo<int>::ctr 和 Foo<int>::count 成员
Foo<int> fi, fi2, fi3;
与任何其他 static 数据成员相同,模板类的每个static 数据成员必须有且仅有一个定义。但是,类模板的每个实例都有一个独有的 static 对象。因此,与定义模板的成员函数类似,我们将 static 数据成员也定义为模板:
template <typename T>
std::size_t Foo<T>::ctr=; //定义并初始化 ctr
与类模板的其他任何成员类似,定义的开始部分是模板的参数列表,随后是我们定义的成员的类型和名字。与往常一样,成员名包括成员的类名,对于从模板生成的类来说,类名包括模板实参。因此,当使用一个特定的模板参数类型实例化 Foo 时,将会为该类类型实例化一个独立的 ctr ,并将其初始化为 0。
与非模板类的静态成员相同,我们可以通过类类型对象来访问一个类模板的 static 成员,也可以使用作用域运算符直接访问成员。当然,为了通过类来直接访问 static 成员,我们必须引用一个特定的实例。
运行示例:
#include<iostream>
#include<vector>
#include<string>
using namespace std; template <typename T>
class Foo {
public:
static std::size_t count() {
return ctr;
}
void addctr() {
ctr++;
}
void subctr() {
ctr--;
}
private:
static std::size_t ctr;
// 下面可以有其他成员接口
};
template <typename T>
std::size_t Foo<T>::ctr = ; //定义并初始化 ctr int main(int argc, char* argv[])
{
Foo<int>fi;
cout << "fi.count()=" << fi.count() << endl;
fi.addctr();
Foo<int>fi2;
fi2.addctr();
cout << "fi2.count()=" << fi2.count() << endl;
cout << "fi.count()=" << fi.count() << endl;
cout << "Foo<int>::count()=" << Foo<int>::count() << endl;
Foo<double>fd;
cout << "fd.count()=" << fd.count() << endl;
return ;
}
运行结果:
S:\ComputerTech\VS2015\ZhangSir_Proj\Console\Console\Debug>template.exe
fi.count()=
fi2.count()=
fi.count()=
Foo<int>::count()=
fd.count()=
类似任何其他成员函数,一个 static 成员函数只有在使用时才会实例化。
C++学习笔记(3)----类模板的static成员的更多相关文章
- 类模板的static成员
下列代码可以通过编译吗?如何修改使其通过编译? template <class T> struct sum { static void foo(T op1 , T op2){ c ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- C++学习笔记(2)----类模板和友元
当一个类包含一个友元声明时,类与友元各自是否是模板是相互无关的.如果一个类模板包含一个非模板友元,则友元被授权可以访问所有模板实例.如果友元自身是模板,类可以授权给所有友元模板实例,也可以只授权给特定 ...
- C++ Primer 学习笔记_53_类和数据抽象 --友元、static员
分类 --友元.static成员 一.友元 友元机制同意一个类将对其.友元关系:一个样例 如果一个窗体管理类Window_Mgr可能须要訪问由其管理的Screen对象的内部数据.Screen应该同意其 ...
- Java学习笔记之---类和对象
Java学习笔记之---类和对象 (一)类 类是一个模板,它描述一类对象的行为和状态 例如:动物类是一个类,动物们都有属性:颜色,动物们都有行为:吃饭 public class Dog { Stri ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- 微信小程序开发:学习笔记[2]——WXML模板
微信小程序开发:学习笔记[2]——WXML模板 快速开始 介绍 WXML 全称是 WeiXin Markup Language,是小程序框架设计的一套标签语言,结合小程序的基础组件.事件系统,可以构建 ...
- UML学习笔记:类图
UML学习笔记:类图 有些问题,不去解决,就永远都是问题! 类图 类图(Class Diagrame)是描述类.接口以及它们之间关系的图,用来显示系统中各个类的静态结构. 类图包含2种元素:类.接口, ...
随机推荐
- 11种绕过CDN查找真实IP方法
0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有: http://ping.chin ...
- linux下不同颜色文件的性质
绿色文件: 可执行文件,可执行的程序 红色文件:压缩文件或者包文件 蓝色文件:目录 白色文件:一般性文件,如文本文件,配置文件,源码文件等 浅蓝色文件:链接文件,主要是使用ln命令建立的文件 红色闪烁 ...
- HDU - 6133 启发式合并
题意:给出一棵树共\(n\)个顶点,每个顶点有一个权值\(val_i\),你需要对每个节点统计一个最优解 每个节点的解按照一定规则产生:取出该节点的子树下所有的顶点,把顶点任意排序成一个序列,设为\( ...
- Python 两种获取文件大小的方法
import os r=os.path.getsize("/root/catbird1.stl") f=open("/root/catbird1.stl",&q ...
- 自定义 checkbox 样式
前言:最近在做一个网站,为了统一风格,需要自定义checkbox的样式.所以花了点时间参考了 研究了一下.感觉上面的方法略微麻烦.所以自己重新写了下面的代码,欢迎大家指教.同时,感谢w3cplus提供 ...
- JDBC处理Transaction
package com.ayang.jdbc; import java.sql.*; /** * transaction的构成,随便写一句insenrt,一执行executeUpdate(),它自动提 ...
- Android版本信息及与Linux和Java的关系
1.Android与Linux和Java的关系 Android严格来说,不能算是Linux,Android是一个统称,具体来说,是Google用了Linux的一个核心,用这个核心来管理进程,控制硬件. ...
- Steps to install Docker on Manjaro 16.10--转
https://manjaro-tutorial.blogspot.com/2016/12/how-to-install-docker-on-manjaro-1610.html Open Termin ...
- 图解ARP协议(五)免费ARP:地址冲突了肿么办?
一.免费ARP概述 网络世界纷繁复杂,除了各种黑客攻击行为对网络能造成实际破坏之外,还有一类安全问题或泛安全问题,看上去问题不大,但其实仍然可以造成极大的杀伤力.今天跟大家探讨的,也是技术原理比较简单 ...
- JAVA是否允许返回值类型不同的重载overload或覆盖override
在看<Thinking in java>的时候,看到子类的方法和父类的方法名字相同,但是返回值类型不同,然后就开始怀疑这属于覆盖吗,到网上找到了答案,分析见接下来的网址: http://g ...