博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++--类的静态成员
阅读量:4317 次
发布时间:2019-06-06

本文共 1771 字,大约阅读时间需要 5 分钟。

类的静态成员(static)

有时候,类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。

声明静态成员

可以使public/private的,类型可以使常量、引用、指针、类类型等。

class Account{public:    void calculate(){amount+=amount*interestRate;}    /*静态成员函数*/    static double rate(){
return interestRate;} static void rate(double);private: std::string owner; double amount; /*静态数据成员*/ static double interestRate; static double initRate();};

对象中不包含任何与静态数据成员有关的数据。因此,每个Account对象将包含两个数据成员:owner和amount。只存在一个interestRate成员,而且它被所有Account对象共享。

类似的,静态成员函数也不与任何对象绑定在一起,他们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们不能再static函数体内使用this指针。

使用类的静态成员

double r;r=Account::rate();     //使用作用域运算符访问静态成员/********************************************/Account ac1;Account *ac2=&ac1;r=ac1.rate();           //通过Accountd 的对象或引用访问r=ac2->rate();        //通过指向Account 对象的指针访问

虽然静态成员不属于类的某个对象,但仍然可以使用类的对象、引用或者指针来访问静态成员。

成员函数不用通过作用域运算符就能直接使用静态成员(把静态成员看做类内成员就行)。

定义类静态成员(static关键字只出现在类内部声明)

静态成员函数:定义可内可外,外部不写static,外部必须有作用域运算符(和定义在外部的普通成员函数一样)

静态数据成员:定义在外,外部不写static,外部必须有作用域运算符

/*静态成员函数定义*/void Acount::rate(double newRate){    interestRate=newRate;}/*静态数据成员定义并初始化*/double Account::interestRate=initRate();   //注意作用域运算符不能忘

类似全局变量,静态数据成员定义在任何函数之外。一旦定义,就一直存在于程序的整个生命周期中。

静态成员的类内初始化??

通常,类的静态成员不应该在类的内部初始化。然而,可以为静态成员提供const整数类型的类内初始值,不过要求静态成员必须是字面值常量类型的constexpr.

class Account{...private:    static constexpr int period=30;    double daily_tbl[period];};//一个不带初始值的静态成员的定义constexpr int Account::period;      //初始值在类的定义内提供

即使一个常量静态成员在类内部被初始哈了,通常情况下也应该在类的外部定义一下该成员。

静态成员能用于某些场景,而普通成员不能

1.静态数据成员可以使不完全类型。特别的,静态数据成员的类型可以使它所属的类类型。

2.可以使用静态数据成员作为默认实参。

class Screen{public:    //bk表示一个在类中稍后定义的静态成员    Screen& clear(char=bk);private:    static Screen mem;     //不完全类型Screen    static const char bk;    //bk可作为默认实参};

 

转载于:https://www.cnblogs.com/cygalaxy/p/7002716.html

你可能感兴趣的文章
oracle的级联更新、删除
查看>>
多浏览器开发需要注意的问题之一
查看>>
Maven配置
查看>>
HttpServletRequest /HttpServletResponse
查看>>
SAM4E单片机之旅——24、使用DSP库求向量数量积
查看>>
从远程库克隆库
查看>>
codeforces Unusual Product
查看>>
hdu4348 - To the moon 可持久化线段树 区间修改 离线处理
查看>>
springMVC中一个class中的多个方法
查看>>
Linux系统安装出错后出现grub rescue的修复方法
查看>>
线段树模板整理
查看>>
[教程][6月4日更新]VMware 8.02虚拟机安装MAC lion 10.7.3教程 附送原版提取镜像InstallESD.iso!...
查看>>
[iOS问题归总]iPhone上传项目遇到的问题
查看>>
Python天天美味(总) --转
查看>>
Spring Framework tutorial
查看>>
【VS开发】win7下让程序默认以管理员身份运行
查看>>
【机器学习】Learning to Rank 简介
查看>>
Unity 使用实体类
查看>>
【转】通过文件锁实现,程序开始运行时,先判断文件是否存在,若存在则表明该程序已经在运行了,如果不存在就用open函数创建该文件,程序退出时关闭文件并删除文件...
查看>>
MySQL常见注意事项及优化
查看>>