1 类的static成员
问题:统计A类型创造了多少个?
方法一:全局变量(不提倡)
我们可以在A类中把通过构造的和通过拷贝的分别记录打印就好了,我们分别用不同的两个变量来进行记录
int num1 = 0;
int num2 = 0;
class A
{
public:
A()
{
++num1;
}
A(const A& aa)
{
++num2;
}
};
A Func(A a)
{
A copy(a);
return copy;
}
int main()
{
A a1;
A a2 = Func(a1);
cout << num1 << endl;
cout << num2 << endl;
}
注意:全局变量在一些简单的程序中不会有问题,但是在项目中可能会出现错误。如果在.h中定义,就有可能发生链接错误。并且放成全局也不利于封装性。
方法二:静态成员变量
class A
{
public:
A()
{
++_count1;
}
A(const A& aa)
{
++_count2;
}
//静态成员变量属于整个类
static int _count1;//声明
static int _count2;
int _a;
};
A Func(A a)
{
A copy(a);
return copy;
}
//定义
int A::_count1 = 0;
int A::_count2 = 0;
int main()
{
A a1;
A a2 = Func(a1);
cout << sizeof(a1) << endl;
cout << a1._count1 << endl;
cout << a2._count1 << endl;
cout << a1._count2 << endl;
cout << a2._count2 << endl;
cout << A::_count1 << endl;
cout << A::_count1 << endl;
return 0;
}
这里我们发现sizeof这个类,计算大小是不会计算静态成员的。因为静态成员为所有类对象所共享(在静态区),不属于某个具体的实例,所以不会纳入类内的计算。
其次:在类内静态成员只是声明,静态成员变量必须在类外定义,定义时不添加static关键字。
如果静态成员是私有的就需要Get()函数提供接口来访问
class A
{
public:
A()
{
++_count1;
}
A(const A& aa)
{
++_count2;
}
int GetCount1()
{
return _count1;
}
int GetCount2()
{
return _count2;
}
private:
static int _count1;//声明
static int _count2;
int _a;
};
A Func(A a)
{
A copy(a);
return copy;
}
//定义
int A::_count1 = 0;
int A::_count2 = 0;
int main()
{
A a1;
A a2 = Func(a1);
cout << a1.GetCount1() << endl;
cout << a2.GetCount2() << endl;
return 0;
}
我们要使用对象调用Get()函数,那假如没有对象,我们可以把函数写成静态成员函数
但是需要注意的是static成员函数没有this指针,因此不能访问非静态成员
class A
{
public:
A()
{
++_count1;
}
A(const A& aa)
{
++_count2;
}
//成员函数也可以是静态的
static int GetCount1()
{
return _count1;
}
static int GetCount2()
{
return _count2;
}
private:
//静态成员变量属于整个类
static int _count1;//声明
static int _count2;
int _a;
};
A Func(A a)
{
A copy(a);
return copy;
}
//定义
int A::_count1 = 0;
int A::_count2 = 0;
int main()
{
A a1;
A a2 = Func(a1);
cout << a1.GetCount1() << endl;
cout << a2.GetCount2() << endl;
cout << A::GetCount1() << endl;
cout << A::GetCount2() << endl;
return 0;
}
特性:
- 静态成员 为所有 类对象所共享 ,不属于某个具体的实例。
- 静态成员变量 必须在 类外定义 ,定义时不添加 static 关键字。
- 类静态成员即可用类名 :: 静态成员或者对象 . 静态成员来访问。
- 静态成员函数 没有 隐藏的 this 指针 ,不能访问任何非静态成员。
- 静态成员和类的普通成员一样,也有 public 、 protected 、 private3 种访问级别,也可以具有返回值。