目录

一、声明静态成员:

二、定义静态成员:

三、使用类的静态成员:

四、静态成员类内初始化:

五、静态成员与普通成员的区别:

六、案例代码:


类内的静态成员包括: 静态数据成员 和 静态成员函数

类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。

一、声明静态成员:

成员(函数 或 变量 )声明之前加上关键字 static

静态成员可以是 public 或 private的。

静态数据成员的 类型 可以是 常量、引用、指针、类类型等

class Account
{
public:Account(std::string name, double mount):owner(name),amount(mount){ }void calculate() {amount += amount * interestRate;std::cout << amount << std::endl;}//获取当前利率static double rate(){return interestRate;}//用于更新ratestatic void rate(double);private:std::string owner;double amount;static double interestRate;static double initRate();
};

上面例子中的静态成员有:

static double rate();static void rate(double);static double interestRate;static double initRate();

说明:

1. 每个Account对象将包含两个数据成员:owner 和 amount 。 只存在一个interestRate对象而且它被所有Account对象共享。

2. 静态成员函数,不与任何对象绑定在一起,它们不包含this指针,不能在static函数体内使用this指针。

3. 作为结果,静态成员函数不能声明成 const的。

二、定义静态成员:

1. 静态成员函数:

像其他成员函数一样,既可以在类的内部 ,也可以在类的外部定义静态成员函数。

在类的外部定义静态成员函数时,不能重复static关键字,该关键字只出现在类内部的声明语句

比如,上面定义的Account类中的rate函数,在类外的定义如下:

//在类外定义,静态成员函数,不包含 static关键字void Account::rate(double a)
{interestRate = a;
}

2. 静态数据成员:

静态数据成员,不是在创建类的对象时被定义的,它们不是由类的构造函数初始化的。(比如:上面定义的Account类中的静态数据成员 interestRate)

不能在类的内部初始化静态成员,必须在类的外部定义 和 初始化每个静态成员 。 一个静态数据成员只能定义一次。

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

//定义并初始化一个静态成员
double Account::interestRate = initRate();

【定义了名为 interestRate对象,该对象是 类Account的静态成员, 其类型是double。 从类名开始,这条语的剩余部分就都位于类的作用域之内了,因此可以直接调用initRate函数。】

三、使用类的静态成员:

使用作用域运算符直接访问静态成员:

double current_rate;
// 通过 域运算符,调用rate()函数,获取当前的利率
current_rate= Account::rate();Account ac1;
Account* ac2 = &ac1;//通过对象(指针),调用rate()函数,获取当前的利率
current_rate = ac1.rate();
current_rate = ac2->rate();

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

四、静态成员类内初始化:

虽然类的 静态成员 不应该在类的内部初始化, 但是,C++中可以为 字面值常量类型 constexpr 的静态成员 提供 const 整数类型(只是 整数类型)的类内初始值。初始值 必须 常量表达式。

class Account
{
public:....
private:static constexpr int period = 100;double daily_table[period];
}

五、静态成员与普通成员的区别:

静态成员独立于对象, 而 普通成员是和具体的对象关联的。

区别一:

静态成员可以是不完全类型。   特别的,静态数据成员的类型可以是它所属的类类型; 而非静态数据成员则受到限制,只能声明成 它所属累的指针或引用:

class Bar
{
public:.....
private:static Bar mem1;Bar* mem2; //正确:指针成员可以是不完全类型Bar mem3; //错误:数据成员必须是完全类型
}

区别二:

可以使用静态成员作为 默认实参

class Screen
{
public://bkground表示一个在类中稍后定义的静态成员Screen& clear(char = bkground);private:static const char bkground;
}

六、案例代码:

有的时候类需要它的一些成员与类本身直接相关 , 而不是与类的各个对象关联。 例如,一个银行的账户类中有一个数据成员来表示当前的基准利率,每个类的对象都能够使用该基准利率,并且一旦利率浮动,所有的对象都能使用新值。

staitc_content.h 头文件如下:

#ifndef _STATIC_CONTENT_H
#define _STATIC_CONTENT_H
#include<string>class Account
{
public:Account(std::string name, double mount):owner(name),amount(mount){ }void calculate() {amount += amount * interestRate;std::cout << amount << std::endl;}static double rate(){return interestRate;}//用于更新ratestatic void rate(double);private:std::string owner;double amount;static double interestRate;static double initRate();
};
//定义并初始化一个静态成员
//静态成员,并不属于某一个类的对象,而是属于类
//因为从类名 Account后面开始,剩余的部分都位于类的作用域之内,因此可以直接使用initRate函数
double Account::interestRate = initRate();void Account::rate(double a)
{interestRate = a;
}double Account::initRate()
{return 0.0;
}#endif

static_content.cpp 代码如下:

#include <iostream>
#include"static_content.h"int main()
{Account my("my",100);std::cout << my.rate() << std::endl;//变更利率my.rate(6.7);std::cout << "my的利率 " << my.rate() << std::endl;Account Xiaohui("Xiao Hui",200);std::cout << "Xiao hui的利率 "<<Xiaohui.rate() << std::endl;
}

代码执行的结果如下:

[C++] 类的静态成员 (静态数据成员 和 静态成员函数)相关推荐

  1. 类的静态数据成员和静态成员函数

    一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中, ...

  2. C++类的静态数据成员和静态成员函数

    目录 公有属性 静态数据成员 静态成员函数 公有属性 一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相 ...

  3. 静态数据成员与静态成员函数

    3-6 静态数据成员与静态成员函数 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握静态数据成员和静态成员函数的用法 要求设计一个点类 ...

  4. 3-6 静态数据成员与静态成员函数

    3-6 静态数据成员与静态成员函数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 通过本题 ...

  5. C++学习(五) 静态数据成员和静态成员函数

    文章目录 1.静态成员: 1.1.说明 1.2.格式 2.静态成员函数 2.1.说明 2.2.格式 1.静态成员: 1.1.说明 静态成员包括静态数据和静态成员函数. (1).静态数据成员的定义与普通 ...

  6. 静态数据成员和静态成员函数

    转载自:https://blog.csdn.net/computer_liuyun/article/details/29235111 c++中的static静态数据成员和静态成员函数应该是让大家比较头 ...

  7. 静态数据成员和静态成员函数(static)

    目录 一.关于静态成员 二.静态数据成员和普通数据成员的共同点 三.为什么要使用静态数据成员 四.关于静态数据成员的初始化 五. 静态成员的访问方式 六.静态成员函数 1.与静态数据成员不同,静态成员 ...

  8. 【C++之静态数据成员和静态成员函数】计算商品总销售款和平均售价

    题目要求 商店销售某一商品,商店每天公布统一的折扣(discount).同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购 10 件以上者,还可以享受 9.8 折优惠.现已知当天 ...

  9. c++之静态数据成员与静态成员函数

    什么是静态数据成员? 数据成员我们之前学过,是对象的属性. 同一个类,不同的对象,可能拥有不同的属性 例如一个车行,不同的车有不同的颜色,不同的耗油量...等等属性 但是当我们统计一个公有的数据,用数 ...

最新文章

  1. C# 判断远程文件是否存在
  2. php 输出函数结果,PHP向浏览器输出内容的4个函数总结
  3. c嵌入python类获取返回值
  4. Apache Kafka-消费端消费重试和死信队列
  5. android ndk x86 arm,How to use SIGRTMIN in x86 or armeabi-v7a abi in Android NDK?
  6. C — 对C语言的认识
  7. uniapp 微信小程序打包 vendor.js过大 导致打包超过2M
  8. 【教程】油猴脚本开发入门教程
  9. 倍福--读取控制器诊断信息
  10. 2020教师计算机考试笔试题,2020教师招聘考试《信息技术》练习题之答案解析
  11. 说话人识别ALIZE工具包的编译
  12. redis的配置文件修改
  13. HealthKit入门:第1部分
  14. Solr Facet
  15. 腾讯云工商注册服务重磅上线!全场低至10元起
  16. 0033__PDM,全称为 Persepolis Download Manager
  17. ffmpeg nvenc编码
  18. 君正X2000/X2000E芯片性能和处理器介绍
  19. 高速下载Arxiv论文的解决方案
  20. Intellij IDEA Spring Configuration check

热门文章

  1. Whitecoin区块链钱包高级功能使用命令
  2. 正点原子IMX6ULL开发板设置静态IP
  3. 玩转幕布,你也能成为笔记效率达人
  4. 2022 年顶级游戏开发工具
  5. 时间选择器控件默认时间自定义
  6. 测试开发工程师的薪资上限究竟在哪?年薪100W都不是梦...
  7. 一个PHP文件搞定支付宝系列之手机网站支付(兼容微信浏览器) 转
  8. Linux中glob()、globfree()、getcwd()函数
  9. 截图工具当前未在计算机上运行 请重启_吉林苹果ipad10.5换电池维修培训费用,手机屏更换,请看_京宏通讯器材维修培训学校...
  10. microblaze软核处理器及其ip核调用