[C++] 类的静态成员 (静态数据成员 和 静态成员函数)
目录
一、声明静态成员:
二、定义静态成员:
三、使用类的静态成员:
四、静态成员类内初始化:
五、静态成员与普通成员的区别:
六、案例代码:
类内的静态成员包括: 静态数据成员 和 静态成员函数。
类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
一、声明静态成员:
在成员(函数 或 变量 )声明之前加上关键字 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++] 类的静态成员 (静态数据成员 和 静态成员函数)相关推荐
- 类的静态数据成员和静态成员函数
一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中, ...
- C++类的静态数据成员和静态成员函数
目录 公有属性 静态数据成员 静态成员函数 公有属性 一些类对象可能会具有一些相同的属性,如果用普通数据成员来描述这些相同的属性,这意味着我们需要给每个对象的这个数据成员设定相同的值,如果改变类对象相 ...
- 静态数据成员与静态成员函数
3-6 静态数据成员与静态成员函数 Time Limit: 1000MS Memory limit: 65536K 题目描述 通过本题目的练习可以掌握静态数据成员和静态成员函数的用法 要求设计一个点类 ...
- 3-6 静态数据成员与静态成员函数
3-6 静态数据成员与静态成员函数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 通过本题 ...
- C++学习(五) 静态数据成员和静态成员函数
文章目录 1.静态成员: 1.1.说明 1.2.格式 2.静态成员函数 2.1.说明 2.2.格式 1.静态成员: 1.1.说明 静态成员包括静态数据和静态成员函数. (1).静态数据成员的定义与普通 ...
- 静态数据成员和静态成员函数
转载自:https://blog.csdn.net/computer_liuyun/article/details/29235111 c++中的static静态数据成员和静态成员函数应该是让大家比较头 ...
- 静态数据成员和静态成员函数(static)
目录 一.关于静态成员 二.静态数据成员和普通数据成员的共同点 三.为什么要使用静态数据成员 四.关于静态数据成员的初始化 五. 静态成员的访问方式 六.静态成员函数 1.与静态数据成员不同,静态成员 ...
- 【C++之静态数据成员和静态成员函数】计算商品总销售款和平均售价
题目要求 商店销售某一商品,商店每天公布统一的折扣(discount).同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购 10 件以上者,还可以享受 9.8 折优惠.现已知当天 ...
- c++之静态数据成员与静态成员函数
什么是静态数据成员? 数据成员我们之前学过,是对象的属性. 同一个类,不同的对象,可能拥有不同的属性 例如一个车行,不同的车有不同的颜色,不同的耗油量...等等属性 但是当我们统计一个公有的数据,用数 ...
最新文章
- C# 判断远程文件是否存在
- php 输出函数结果,PHP向浏览器输出内容的4个函数总结
- c嵌入python类获取返回值
- Apache Kafka-消费端消费重试和死信队列
- android ndk x86 arm,How to use SIGRTMIN in x86 or armeabi-v7a abi in Android NDK?
- C — 对C语言的认识
- uniapp 微信小程序打包 vendor.js过大 导致打包超过2M
- 【教程】油猴脚本开发入门教程
- 倍福--读取控制器诊断信息
- 2020教师计算机考试笔试题,2020教师招聘考试《信息技术》练习题之答案解析
- 说话人识别ALIZE工具包的编译
- redis的配置文件修改
- HealthKit入门:第1部分
- Solr Facet
- 腾讯云工商注册服务重磅上线!全场低至10元起
- 0033__PDM,全称为 Persepolis Download Manager
- ffmpeg nvenc编码
- 君正X2000/X2000E芯片性能和处理器介绍
- 高速下载Arxiv论文的解决方案
- Intellij IDEA Spring Configuration check
热门文章
- Whitecoin区块链钱包高级功能使用命令
- 正点原子IMX6ULL开发板设置静态IP
- 玩转幕布,你也能成为笔记效率达人
- 2022 年顶级游戏开发工具
- 时间选择器控件默认时间自定义
- 测试开发工程师的薪资上限究竟在哪?年薪100W都不是梦...
- 一个PHP文件搞定支付宝系列之手机网站支付(兼容微信浏览器) 转
- Linux中glob()、globfree()、getcwd()函数
- 截图工具当前未在计算机上运行 请重启_吉林苹果ipad10.5换电池维修培训费用,手机屏更换,请看_京宏通讯器材维修培训学校...
- microblaze软核处理器及其ip核调用