C++ 静态数据成员与静态成员函数

在类中的数据成员或成员函数定义或声明前以static关键词开头,即构成静态数据成员与静态成员函数。

静态数据成员

1.静态数据成员的实现

class Time
{
public :
    void showtime();
private:
    static int hour; //定义hour为静态数据成员
    int minute;
    int sec;
};

2.静态数据成员的意义

C++为什么要进入静态数据成员这个概念,或者它有什么好处。 静态数据成员可以实现一个类中不同对象的某个数据的值是一样的。比如一个类中包含的数据成员有:班级,姓名,学号,性别。那么对于一个班的几个同学,班级的值一定是一样的。假设每一个学生就是一个对象,那么不同的对象的数据中,班级这个数据就是一样的。 所以这也就是静态的数据成员的意义,当班级的数据前加上static关键字后,班级被定义为静态数据成员,当这个值改变时,该类实例化出的每一个对象的班级数据全部随之改变。

3.静态数据成员的特性

(1)静态数据成员的属性: 静态数据成员属于类,而不属于某一个对象。

(2)静态数据成员的初始化: 静态数据成员在类内定义,而不能在类内完成初始化,直接赋值和利用构造函数初始化都不可以。我是这样理解这个特性的:

//直接赋值完成初始化
class Time
{
public :
    void showtime();
private:
    static int hour = 0;
    int minute;
    int sec;
};

这个很好理解,这显然是错的,因为只有静态常量才能在类内完成初试化,要改成这样才可以static const int hour = 0;但是如果写成这样,该数据成员将无法改变,显然我们并不希望如此。

//利用构造函数初始化静态数据成员
class Time
{
public :
    Time()
    {
        hour = 0;
        minute = 0;
        sec = 0;
    }
    void showtime();
private:
    static int hour;
    int minute;
    int sec;
};

利用构造函数初始化静态数据成员,这也是错的。我们可以这样理解这件事,在构造函数的博客里提到:类中的构造函数在实例化对象时被系统调用,然后实现对成员数据的赋值工作,显然这些数据成员属于对象。而静态数据成员属于类,不属于任何一个对象。

那么应该如何完成静态数据成员的初始化:静态数据成员的初始化只能在类体外完成。

class Time
{
public :
    void showtime();
private:
    static  int hour ;
    int minute;
    int sec;
};
 int Time::hour= 10;

这是正确的方式!!看着很奇怪有没有!!没有对象,直接用类名引用成员,这也恰恰说明了静态数据成员不属于任何对象,而属于类本身。

(3)静态数据成员的引用: 从(2)中已经看到了,可以直接用类名来引用静态数据成员。同时也可以通过对象来引用,这是因为虽然静态数据成员不属于某一个对象而是属于类,但是对象属于类,所有也就可以应用对象来引用静态数据成员。

4.静态数据成员的应用

#include <iostream>
using namespace std;

class Time
{
public :
    Time(int,int);
    void showtime();
private:
    static  int hour ;
    int minute;
    int sec;
};
Time::Time(int m,int s)
{
    minute = m;
    sec = s;
}
 int Time::hour= 10;
void Time::showtime()
{
    cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
int main()
{
    Time time1(2,3);
    time1.showtime();
    Time time2(4,5);
    time2.showtime();
    getchar();
    return 0; 
}

运行结果: hour:10 minute:2 sec:3 hour:10 minute:4 sec:5

可以看到:两个对象的hour成员都是10。

静态成员函数

和静态数据成员类似,静态成员函数一样也是在前面加入static关键字。 1.静态成员函数的实现

class Time
{
public :
    static void showtimeh();//定义showtimeh()为静态成员函数
    void showtime();
private:
    static int hour; //定义hour为静态数据成员
    int minute;
    int sec;
};

2.静态成员函数的意义

静态成员函数可以使一切不需要实例化就可以有确定行为方式的函数使用起来更加方便,比如某些通用算法。由于静态成员函数只能访问本类中的静态数据成员,而无法访问非静态数据成员,这样使程序设计更加清晰。

3.静态数据成员的特性

(1)静态成员函数的属性: 静态成员函数属于类,而不属于某一个对象。

(2)静态成员函数的访问: 静态成员函数只能访问本类中的静态数据成员非静态成员函数可以访问本类中的静态数据成员非静态数据成员4.静态数据成员的应用

#include <iostream>
using namespace std;

class Time
{
public :
    Time(int,int);
    static void showtimeh();
     void showtime();
private:
    static  int hour ;
    int minute;
    int sec;
};
Time::Time(int m,int s)
{
    minute = m;
    sec = s;
}
 int Time::hour= 10;
void Time::showtime()
{
    cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
}
void Time::showtimeh()
{
    cout<<"hour:"<<hour<<endl;
}
int main()
{
    Time time1(2,3);
    time1.showtime();
    Time::showtimeh();
    getchar();
    return 0; 
}

运行结果: hour:10 minute:2 sec:3 hour:10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青枫的专栏

java基础学习_集合类04_Map接口、Collections工具类_day18总结

============================================================================= ==...

451
来自专栏用户3030674的专栏

约瑟夫环(排成圈)

/** * 约瑟夫环问题主要是考虑下标问题,只要解决了下标控制问题,这个题目就不难了 * 在这里我是分成了3中情况: * 1,下标小于剩余人数时:删...

622
来自专栏武培轩的专栏

剑指Offer-把数组排成最小的数

题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成...

2705
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-day07-知识点相关题-自定义数据类型;ArrayList

Java基础-day07-知识点相关题 一、定义类:包含main()方法,按以下要求编写程序: 1)实例化一个ArrayList,只存储String数据: 2)...

3598
来自专栏天天

String

421
来自专栏青枫的专栏

Java集合学习总结

383
来自专栏闻道于事

Java之集合初探(一)

一、集合概述、区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器。 为什么出现集合类? 面向对象语言对事物的体现都...

2297
来自专栏武培轩的专栏

剑指Offer-从上往下打印二叉树

题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路 使用两个队列一个存放节点,一个存放值。先将根节点加入到队列中,然后遍历队列中的元素,遍历...

2527
来自专栏python3

python 迭代器

一类是generator,包括生成器和带yield的generator function。

681
来自专栏Java3y

Collection总览

1365

扫码关注云+社区