创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言内容💖:
专栏:c语言之路重点知识整合
目录
一、静态成员
静态成员需要使用static
关键字进行修饰
static int a;
static void fun(){}
二、静态成员变量
在CTest
类中定义静态成员变量:
#include <iostream>
using namespace std;
class CTest
{
public:
int m_a;
static int m_b;
static long long m_c;
};
在构造函数中进行初始化:
CTest()
{
m_a = 1;
m_b = 2; //初始化?? 赋值
m_c = 3;
}
但是在主函数中使用静态成员变量m_b
和m_c
时,出现报错:
此时的静态成员变量m_b
和m_c
并未真正的被初始化,在构造函数中仅是为其赋值
静态成员变量需要在类外进行定义并且初始化
1.静态成员变量属于类
对一个空类只定义静态成员变量,再输出类和对象的字节大小
#include <iostream>
using namespace std;
class CTest
{
public:
static int m_b;
static long long m_c;
CTest()
{
m_b = 2; //初始化?? 赋值
m_c = 3;
}
};
//类外 定义以及初始化
int CTest::m_b = 2;
long long CTest::m_c = 3;
int main()
{
CTest tst;
cout << sizeof(tst) << " " << sizeof(CTest) << endl;
return 0;
}
输出结果都为1,仅为占位的大小
因此静态成员变量是属于类的,在编译期就存在
2.静态成员变量一个类中只会存在一份
创建第二个对象tst2
再对类中成员进行取地址操作:
可以看出:
静态成员变量一个类中只会存在一份
3.静态成员变量存在与否和是否定义对象无关
不通过对象,通过类名作用域也可调用类中的静态成员变量:
因此静态成员变量存在与否和是否定义对象无关
4.多个对象共享一份静态成员变量
静态成员变量一个类中只会存在一份,对其中一个对象的静态变量值进行修改,另一个也会随之改变:
静态static成员属性
-
属于类,编译期存在,一个类中只会存在一份,多个对象共享这一份静态成员
-
存在与否和是否定义对象无关,在构造函数中不能对其初始化(赋值)
-
静态成员属性需要在类外进行初始化,格式:类型 类名 类名作用域 ,给定初始值
三、静态成员函数
1.静态成员函数的定义
//普通函数
void fun(/* CTest* const this */)
{
cout << /* this-> */m_a << " " << m_b << endl;
}
//静态函数
static void funstatic()
{
//...
}
与静态成员变量相同,静态成员函数也 属于类,编译期存在,一个类中只会存在一份,多个对象共享这一份静态成员函数
2.静态成员函数的使用
在静态成员函数中调用非静态变量m_a
和静态变量m_b
static void funstatic()
{
cout << m_a << " " << m_b << endl;
cout << m_a << " " << CTest::m_b << endl;
}
其中,m_a不允许被使用:
而静态成员变量m_b却可以正常使用
这是因为 静态成员函数只能访问静态的成员,使用不了普通成员
static void funstatic2()
{
//fun(); //error
funstatic(); //ok
}
同样也访问不了普通成员函数,只能使用静态成员函数
在主函数中使用时,可以通过对象调用
与静态成员变量相同,也可以不通过对象调用,使用类名作用域直接使用:
CTest tst;
tst.fun();
CTest::funstatic2();
tst.funstatic();
3.静态成员函数没有this指针
this指针
是指向调用该成员函数的类对象的指针
CTest* const this
静态成员函数不依赖于任何类的对象,而是和类本身相关,因此没有this指针
普通成员函数与静态成员函数的区别
-
静态成员函数 没有隐藏的this指针
-
在静态的成员函数中,只能使用静态的成员,在普通成员函数中都能使用
-
静态成员函数可以不通过对象调用,普通函数必须通过对象调用
-
使用:
1.通过对象
2.类名作用域直接使用
本文全部代码:
#include <iostream>
using namespace std;
class CTest
{
public:
int m_a;
static int m_b;
static long long m_c;
CTest()
{
m_a = 1;
m_b = 2; //初始化?? 赋值
m_c = 3;
}
void fun(/* CTest* const this */)
{
cout << /* this-> */m_a << " " << m_b << endl;
}
//静态函数
static void funstatic()
{
/*cout << m_a << " " << m_b << endl;
cout << m_a << " " << CTest::m_b << endl;*/
}
static void funstatic2()
{
//fun(); //error
funstatic(); //ok
}
};
//类外 定义以及初始化
int CTest::m_b = 2;
long long CTest::m_c = 3;
int main()
{
CTest tst;
cout << tst.m_a <<" " << tst.m_b <<" " << tst.m_c << endl;
cout << sizeof(tst) << " " << sizeof(CTest) << endl;
CTest tst2;
cout << &tst.m_a << " " << &tst2.m_a << endl;
cout << &tst.m_b << " " << &tst2.m_b << endl;
//---------不通过对象---------
cout << CTest::m_c << endl;
//------共享-------
tst.m_b = 20;
cout << tst2.m_b << endl;
tst.fun();
CTest::funstatic2();
tst.funstatic();
return 0;
}
大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。 |
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●) |