/*#include<iostream.h>
class X {
public:
X(){}//为什么不能缺省,a,b调用默认的构造函数呢?
static int s;//静态数据成员
static void fun();//静态成员函数
};
int X::s=10;
void main()
{
X a,b;
a.s=10;
cout<<X::s<<"/n";//对于公有成员,可以使用成员名限定对其进行访问
cout<<b.s<<"/n";
}
*/
/*静态成员为该类的所有对象共享,它们被存储与一个公用内存中。例如:
X a,b;
a.s=10;
cout<<b.s;
在类中仅对静态数据成员进行了引用性说明,必须在文件作用域的某个地方进行定义性说明
并且这种说明只能有一次,例如:int X::s;
在说明中也可以进行初始化,例如:
int X::s=5;
注意,在说明中要对数据成员进行成员名限定。
即使没有建立对象,静态成员就已经存在。对于公有成员,可以使用成员名限定对其进行的访问。
#include<iostream.h>
class X {
public:
X(){}//为什么不能缺省,a,b调用默认的构造函数呢?
static int s;//静态数据成员
static void fun();//静态成员函数
};
int X::s=10;
void main()
{
cout<<X::s<<"/n";//对于公有成员,可以使用成员名限定对其进行访问
}
由于数据隐藏的需要,静态数据成员通常被说明为私有的,而通过定义公有的静态成员函数来访问静态数据成员
例如:
*/
/*#include<iostream.h>
class X {
private:
static int s;//静态数据成员
public:
X(){}//为什么不能缺省,a,b调用默认的构造函数呢?
static int fun();//静态成员函数
};
int X::s=10;
int X::fun()
{
return s;
}
main()
{
cout<<X::fun()<<endl;
X a;
cout<<a.fun()<<"/n";
return 0;
}*/
/*
注意,由于static不是函数类型中的一部分,所以在类定义之外定义静态成员函数时不使用static,在类中定义的
静态成员函数是内联的
一般来说,通过成员名限定比使用对象名访问静态成员要好。因为静态成员不是对象的成员。
静态成员可以被继承,这时,基类对象和派生类的对象共享该静态成员,除此之外,在类等级中对
静态成员的其他特性(例如,静态成员在派生类中的访问权限,在派生类中重载成员函数等)的分析与一般成员类似。
*/
/*静态成员函数不能被说明为虚函数,静态成员具有外部连接属性,static仅有的含义是使该成员为该类的所有对象共享*/
/*类中的任何成员函数都可以访问静态成员,但静态成员函数只能通过对象名(或指向对象的指针)访问该对象的非静态成员,
因为静态成员函数没有this 指针
*/
#include<iostream.h>
class X {
private:
int a;
static int s;//静态数据成员
public:
X(){}//为什么不能缺省,a,b调用默认的构造函数呢?
int fun();
static void sfun(X&);//静态成员函数
};
int X::fun()
{
a=5;
cout<<"a="<<s<<endl;
return a;
}
int X::s=9;
void X::sfun(X& r)//静态成员函数可以直接访问该类的静态数据和函数成员;而访问非静态数据成员必须
{//通过参数传递方式得到对象名,然后通过对象名来访问。通过静态函数成员访问非静态成员相当麻烦。
//a=10;//error 一般情况下,它主要用来访问全局变量或同一个类中的静态数据成员。特别是和后者一起使用。
r.a=10;//ok 达到对同一个类中对象之间共享的数据进行维护的目的。
cout<<"r.a="<<r.a<<endl;
}
main()
{
X b;
cout<<b.fun()<<"/n";
X::sfun(b);//对于公有的静态成员函数,可以通过类名或对象名来调用;而一般的非静态成员函数只能通过对象名来调用
return 0;
}
#include<iostream.h>
class goods{
private:
static int totalweight;
int weight;
public:
goods (int w){
weight=w;
totalweight+=w;
}
goods (goods& gd)
{
weight=gd.weight;
totalweight+=weight;
}
~goods()
{
totalweight-=weight;
}
int getwg()
{
return weight;
}
static int gettotal()
{
return totalweight;
}
};
int goods::totalweight=0;
main()
{
int w;
cout<<"The initial weight of goods:"
<<goods::gettotal()<<endl;
cin>>w;
goods g1(w);
cin>>w;
goods g2(w);
cout<<"The total weight of goods:"
<<goods::gettotal()<<endl;
return 0;
}
/*
输入两个数求和
注意,由于拷贝构造函数影响到该类的对象之外的静态成员,
为防止初始化中出现问题,为类goods定义了一个拷贝初始化构造函数
*/