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 条评论
登录 后参与评论

相关文章

来自专栏机器学习从入门到成神

Vue2.0中v-for迭代语法变化(key、index)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

521
来自专栏和蔼的张星的图像处理专栏

44. 最小子数组

给定一个整数数组,找到一个具有最小和的子数组。返回其最小和。 样例 给出数组[1, -1, -2, 1],返回 -3 思路和最大子数组的思路基本是一样的,...

893
来自专栏数据结构与算法

20:删除单词后缀

20:删除单词后缀 总时间限制: 1000ms 内存限制: 65536kB描述 给定一个单词,如果该单词以er、ly或者ing后缀结尾, 则删除该后缀(题目保...

3434
来自专栏魂祭心

原 yield用法分析

3377
来自专栏kwcode

Ajax jsonp 跨域请求实例

跨域请求 JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进...

35710
来自专栏Golang语言社区

GO-回调函数

1,什么是回调函数。一个函数中有个参数为函数的指针。该函数自己调用自己指针函数即可; 2,为什么要使用回调函数。抽象画了一个函数,简洁代码。异步执行 3,例子:...

2965
来自专栏王磊的博客

js时间格式化通用方法

/** * 时间工具类 */ /** * 获取现在的时间戳(精确到s) * 使用:new Date().nowTimestamp * @type {...

3155
来自专栏微信小程序开发

理解jquery的$.extend & $.fn.extend用法

jQuery为开发插件提拱了两个方法,分别是: 1、jQuery.fn.extend(); //dom方法 2、jQuery.extend(); // 工具...

3029
来自专栏和蔼的张星的图像处理专栏

60. 搜索插入位置二分查找__细节

给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。

833
来自专栏机器学习从入门到成神

JavaScript之作用域与变量

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/articl...

692

扫码关注云+社区