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

相关文章

来自专栏个人分享

Scala语法笔记

JAVA中,举例你S是一个字符串,那么s(i)就是该字符串的第i个字符(s.charAt(i)).Scala中使用apply的方法

1352
来自专栏塔奇克马敲代码

第 15 章 面向对象程序设计

2133
来自专栏小樱的经验随笔

C/C++对bool operator < (const p &a)const的认识,运算符重载详解(杂谈)

下面来进行这段代码的分析: struct node {  //定义一个结构体node(节点) int x; int y; int len;   //nod...

3286
来自专栏Bug生活2048

Python自学之路-内置函数说明及实例(四)

如果提供了promat参数,首先将参数值输出到标准的输出,并且不换行。函数读取用户输入的值,将其转换成字符串。

622
来自专栏运维技术迷

连仕彤博客[Python笔记] isinstance() 函数

isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。但是isinstance和type是有区别的:

481
来自专栏机器学习算法工程师

最长递增子序列

最长递增序列不要求数组元素连续问题,返回递增序列长度和递增序列。o(n^2)做法,顺序比较以第i个元素开头的递增序列即可。 利用动态规划来做,假设数组为1, -...

3526
来自专栏星回的实验室

js重修课[五]:类与模块

这个Range类中定义了一个接受两个参数的构造函数,和includes、foreach、toString三个实例方法,以及ZERO一个静态类方法。

902
来自专栏mukekeheart的iOS之旅

OC学习3——C语言特性之指针

1、指针是C语言中的一个非常重要的概念,实际上,OC系统类的变量、自定义类的变量等都是指针。定义指针变量的语法格式如下,其中*代表一个指针变量,整个语法代表定义...

2348
来自专栏待你如初见

Day09

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

String中的null,以及String s;等区别详解

1、判断一个引用类型数据是否null。 用==来判断。 2、释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM...

3494

扫码关注云+社区