网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事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;
}
编译并执行上述代码,运行结果如下:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新