C++编程语言中类的静态成员介绍_为什么不能把静态成员的初始化放置在类的定义中

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#include <iostream>

using namespace std;

class Cpoint
{
public:
    // 声明静态成员变量
    static int m_nConsTime;
    static int m_nDesTime;
    // 构造函数定义
    Cpoint(int x, int y)
    {
        xp = x;
        yp = y;
        // 每次创建对象时,静态成员变量 m_nConsTime 加1
        m_nConsTime++;
        cout << "[Cpoint] Constructor called: " << m_nConsTime << endl;
    }
    
    // 析构函数定义
    ~Cpoint()
    {
        // 每次调用析构函数时,静态成员变量 m_nDesTime 加1
        m_nDesTime++;
        cout << "[Cpoint] Destructor called:" << m_nDesTime << endl;
    }

private:
    int xp;
    int yp;
};

// (定义并)初始化类的静态成员变量
int Cpoint::m_nConsTime = 0;
int Cpoint::m_nDesTime = 0;

class CRect
{
public:
    // 构造函数定义
    CRect(int x1, int x2):mpt1(x1, x2), mpt2(x1, x2)
    {
        cout << "[CRect] Constructor called." << endl;
    }
    
    // 析构函数定义
    ~CRect()
    {
        cout << "[CRect] Destructor called." << endl;
    }
    
private:
    // 创建类Cpoint对象mpt1和mpt2
    Cpoint mpt1, mpt2;
};

int main()
{
    // 创建类CRect对象p
    CRect p(10,20);
    
    cout << "Hello, world!" << endl;
    
    return 0;
}


编译并执行上述代码,运行结果如下:

3 静态成员函数

把类的成员函数声明为静态的,就可以把函数与类的任何特定对象独立开来。

类的静态成员函数的特点如下:

  • 即使在类对象不存在的情况下,静态成员函数也能被调用——静态成员函数只要使用类名加作用域运算符“::”就可以访问了;
  • 类的静态成员函数只能访问类的静态成员数据、类的其他静态成员函数和类外部的其他函数;
  • 静态成员函数有一个类范围,它不能访问类的 this 指针;
  • 可以使用静态成员函数来判断类的某些对象是否已被创建了;
  • **静态成员函数是类的一部分,但是不是对象的一部分。**如果要在类外调用公用的静态成员函数,要用类名和作用域运算符“::”(如 Box::volume();),也可以通过对象名调用静态成员函数(如 a.volume();),但是这并不意味着此静态成员函数属于对象a(只是用了 a 的类型而已);
  • 静态成员函数不属于对象,它与任何对象都是无关的,因此静态成员函数没有 this 指针,也就是说:非静态成员函数有 this 指针,而静态成员函数没有 this 指针。由此决定了静态成员函数不能直接访问本类中的非静态成员。静态成员函数可以直接引用本类中的静态数据成员,因为静态数据成员同样是属于类的。当然,并不是说静态成员函数绝对不能访问本类中的非静态成员,只不过是不能进行默认访问(因为静态成员函数无法知道应该去找哪个对象的非静态成员),如果非要引用本类中的非静态成员,应该加上具体的对象名以及成员运算符“.”(例如:cout<<a.width<<endl)。

静态成员函数与普通成员函数的区别:

  • 普通成员函数有 this 指针,可以访问类中的任意成员;而静态成员函数没有 this 指针;
  • 静态成员函数没有 this 指针,只能访问类的静态成员(包括静态成员变量和静态成员函数)、以及类外部的其他函数。

3.1 示例1

下面通过一个示例代码,理解一下类的静态成员函数的概念。

示例代码(static_test3.cpp)的内容如下:

#include <iostream>

using namespace std;

class Box
{
public:
    // 声明静态成员变量
    static int objectCount;
    // 构造函数定义
    Box(double l=2.0, double b=2.0, double h=2.0)
    {
        cout <<"Constructor called." << endl;
        length = l;
        breadth = b;
        height = h;
        // 每次创建对象时 objectCount 加 1
        objectCount++;
    }
    // 求立方体的体积
    double Volume()
    {
        return (length * breadth * height);
    }
    // 获取已创建的类对象个数
    static int getCount()
    {
        return objectCount;
    }
    
private:
    double length;     // 长度
    double breadth;    // 宽度
    double height;     // 高度
};
 
// (定义并)初始化类 Box 的静态成员变量objectCount
int Box::objectCount = 0;

int main(void)
{
    // 创建对象前,输出已创建的对象的总数
    cout << "Inital Stage Count is: " << Box::getCount() << endl;
    
    Box Box1(3.3, 1.2, 1.5);    // 创建对象box1
    Box Box2(8.5, 6.0, 2.0);    // 创建对象box2
    
    // 创建对象后,输出已创建的对象的总数
    cout << "Final Stage Count is: " << Box::getCount() << endl;
    
   return 0;
}


编译并执行上述代码,运行结果如下:

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值