【C++程序员的自我修炼】如何统计类中创建对象的个数

山中何事

松花酿酒

春水煎茶


目录

static成员

概念

static成员变量的定义

static成员函数的特点

static成员的特征

求1+2+3+...+n

契子 

有一道面试题:实现一个类,计算程序中创建出了多少个类对象?

相信有很多老铁一开始会不知所措,怎么统计呢?

这个时候我们可以借助 static成员 来解决~


static成员

概念

声明为 static 的类成员称为类的静态成员,用 static 修饰的成员变量,称之为静态成员变量;用 static 修饰的成员函数,称之为静态成员函数。静态成员变量一定要在类外进行初始化。

 举个栗子~

#include<iostream>
#include<cstdlib>
using namespace std;

class A
{
public:
	A()
		:_a(0)
	{}
	static int GetCount()
	{
		return _count;
	}
private:
	int _a;
	static int _count;
};

int A::_count= 0;

static成员变量的定义

有老铁会问 _count 能在初始化列表、构造内部初始化吗?

我们这里来看一下 :

因为 static 在静态区而不在对象中,所以不走初始化列表、构造内部

这里也不能给缺省值,因为缺省值走的是初始化列表

static成员 变量只能在类外初始化  

<1>总结:静态成员变量必须在类外定义,类中只是声明

接下来我们来计算一下这个大小是多少呢?

cout << sizeof(A) << endl;

我们发现 A类 的大小是 4 ,也就是不算 static成员 的大小

<2>总结:静态成员变量尽管声明在类中,但是位置却在静态区所以不计入类的大小

static成员函数的特点

除了静态成员变量还有静态成员函数

	static int GetCount()
	{
		return _count;
	}

静态成员函数有什么特征呢?

没有 this 指针,只能访问静态成员

接下来我们来看看怎么统计一个类创建了多少个对象

#include<iostream>
#include<cstdlib>
using namespace std;

class A
{
public:
	A()
	{
		_count++;
	}
	A(const A& a)
	{
		_count++;
	}
	static int GetCount()
	{
		return _count;
	}
private:
	static int _count;
};

int A::_count= 0;

int main()
{
	A a;
	cout << A::GetCount() << endl;
	A a1, a2;
	A a3(a1);
	cout << A::GetCount() << endl;
	system("pause");
	return 0;
}

因为我们的对象不是构造出来就是拷贝构造出来,我们只需让 _count 在这两个函数内部自增即可

所以结果是符合要求的~

还有一个问题我们来看:下面这段代码创建了多少个对象?

A Func()
{
	A a1;
	return a1;
}

int main()
{
	Func();
	cout << A::GetCount() << endl;
	system("pause");
	return 0;
}

答案是 2 个,因为第一次用构造创建了一个对象,第二次用拷贝构造了一个临时对象返回

与我们的传值传参差不多,形参是实参的临时拷贝,所以这个时候创建了两个对象

注意:但是有些编译器觉得两次构造太麻烦会优化成直接构造,也就是只创建一次 

static成员的特征

静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
静态成员变量必须在类外定义,定义时不添加 static 关键字,类中只是声明
类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
静态成员函数没有隐藏的 this 指针,不能访问任何非静态成员
静态成员也是类的成员,受public、protected、private 访问限定符的限制 

我们学的差不多了,做道题练练手~

求1+2+3+...+n

题目链接:求1+2+3+...+n


求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

数据范围: 0<n≤200
进阶: 空间复杂度 O(1) ,时间复杂度 O(n)

示例1:

输入

5

输出

15

示例2:

输入

1

输出

1

思路:

使用静态成员:

设置静态成员变量 N 和 _count,在构造函数中进行累加运算

创建一个大小为 n 的对象数组,在创建的时候会自动调用 n 次构造函数,即实现了 n 次累加运算

最后调用静态成员函数返回结构即可

代码展示:

class Count
{
    public:
    Count()
    {
        _count += N;
        N++;
    }
    static int Getcount()
    {
        return _count;
    }
    private:
    static int _count;
    static int N;
};

int Count::_count = 0;
int Count::N = 1;

class Solution 
{
public:
    int Sum_Solution(int n) 
    {
        Count arr[n];
        return Count::Getcount();
    }
};

 ​​​​​​​

先介绍到这里啦~

有不对的地方请指出💞

相关推荐

  1. c++qt函数如何返回一个对象对象引用

    2024-04-20 20:48:01       23 阅读
  2. 统计字符串a出现个数

    2024-04-20 20:48:01       15 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-20 20:48:01       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-20 20:48:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-20 20:48:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-20 20:48:01       20 阅读

热门阅读

  1. SQL Server详细使用教程

    2024-04-20 20:48:01       15 阅读
  2. 谈谈Python中的分布式计算和大数据处理

    2024-04-20 20:48:01       13 阅读
  3. springboot集成mqtt

    2024-04-20 20:48:01       14 阅读
  4. 服务器使用-三丰云

    2024-04-20 20:48:01       13 阅读
  5. Python中常见错误汇总(持续更新中)

    2024-04-20 20:48:01       12 阅读