关于类中静态成员函数和静态成员变量的知识点

类中的静态成员函数:

1.函数的行为对所有派生类都一致时,可以声明为静态。

2.因为静态成员函数只跟类有关跟类的实例无关,因此它不需要this指针

3.静态成员函数由于是不与任何对象相关联的,所以是没有this指针的。从这里也可以知道静态成员函数无法访问属于类对象的非静态数据成员,也无法访问非静态成员函数,它只能调用其他的静态成员函数。即静态成员函数不能访问非静态成员(非静态成员函数或者非静态成员变量),但是非静态成员可以直接访问静态成员。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
using namespace std;
class MyClass
{
public:
    MyClass(int a, int b, int c);
    static  void func();
    void printf()
    {
        cout << sum << endl;
    }
private:
    int a, b, c;
    static int sum;//静态成员变量的声明
};
int MyClass::sum = 0;//静态成员变量必须在类外定义和初始化
MyClass::MyClass(int a, int b, int c)
{
    this->a = a;
    this->b = b;
    this->c = c;
    sum += a + b + c;
}
void MyClass::func()
{
    cout << sum << endl;
}
int main()
{
    MyClass A(1, 2, 3);
    A.func();
    A.printf();
    MyClass B(4, 5, 6);
    B.func();
    B.printf();
    //MyClass::printf();//错误,非静态成员函数必须与特定对象相对
    MyClass::func();//静态成员函数是类中的所有对象共享的,并不但属于特定对象
    return 0;
}

  运行结果:

 

类中的静态成员变量:

1.静态成员变量是整个类的实例共享的

2.静态成员变量存储在静态存储区/全局存储局,而非静态成员变量需要实例化才会分配内存。

3.静态成员变量只能在类内声明在类外定义和初始化。

为什么静态成员变量不能在类内定义?

答:为了防止重复定义,静态成员变量是类的所有实例共享的,只需要定义一次就可以,如果在类内定义则每实例化一次类都会重新定义一次静态成员变量,这会产生重复定义。

静态成员不能访问非静态成员,非静态成员可以直接访问类中的静态成员。

posted @   cs_wu  阅读(1868)  评论(2编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示