2020-4-28_c++作业_静态成员
5-5
静态数据成员:
是类中通过关键字static声明的成员数据,不属于类的任何一个对象而为该类的所有对象共享。
特点:
-
类的静态数据成员应该在代码中被显式地初始化,且一般要在类外在全局作用域中进行(除非它是常量),用
::
指明所属的类。class A{ static int a = 3; //错误 static const int b = 3; //正确
-
不属于单个对象而被所有该类的对象所同享,包括该类的派生类对象,由此:
-
静态数据成员可以作为成员函数的默认形参
class A{ static int a; void test(int i = a); //正确
-
静态数据成员的类型可以是所属类的类型
class A{ static A a; //静态数据成员
-
静态数据成员在
const
函数中可以修改class A{ static int a; int b; void test() const { a++; //正确 b++; //错误 }
-
-
具有静态生存期,在定义时就分配内存空间,没用任何对象时都可以访问。
-
外部访问类的静态数据成员能直接通过类名和
::
来访问,也可以使用类的对象、引用或指针来访问。
5-6
静态函数成员:
是在类中加上static关键字声明成员函数。
特点:
-
可以在类中定义。
-
不属于单个对象而被所有该类的对象所同享,由此:
-
静态成员函数不能调用非静态成员函数和非静态数据成员,但非静态成员函数可以调用静态成员。
-
静态成员函数没有this指针,所以静态成员函数不能使用修饰符(函数后面的const关键字)。
static void test() const //错误
-
静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存。
class A{ void test1(); static void test2(); void (B::*p1)() = &B::test1; //不能写&(B::test1) //报错:lvalue required as unary '&' operand void (*p2)() = &B::test2; //可以写&(B::test2)
-
-
具有静态生存期,在定义时就分配内存空间,没用任何对象时都可以访问。
-
在类外调用时,可以直接通过类名和
::
来访问,也可以使用类的对象、引用或指针来访问。
5-7
g namespace std;
class Cat
{
private:
static int numOfCats;
public:
Cat()
{
cout<< "Default construction"<< endl;
numOfCats++;
}
Cat(Cat & ca)
{
cout<< "Copy construction"<< endl;
numOfCats++;
}
~Cat()
{
cout<< "Destruction"<< endl;
numOfCats--;
}
static void getNumOfCats()
{
cout<< "The number of cats is "<< numOfCats<< endl<< endl;
}
};
int Cat::numOfCats = 0;
int main()
{
{
Cat c1;
Cat::getNumOfCats();
Cat c2(c1);
c2.getNumOfCats();
Cat c3 = c1;
Cat::getNumOfCats();
}
Cat::getNumOfCats();
Cat* pc = new Cat;
Cat::getNumOfCats();
delete pc;
Cat::getNumOfCats();
cin.get();
return 0;
}
运行结果: