广告

C++类的static成员

2018-2-10 11:40 214 2 2 分类: 软件与OS 文集: C++学习记录(1)

      对于某些特定类类型的全体对象而言,访问一个全局对象有时是有必要的。在程序运行的任意点可能需要统计已创建的特定类类型对象的数量,但是全局对象会破坏封装,并且没有安全保护,一般的用户代码就可以修改这个值。类可以定义static成员,用于解决同一个类的不同对象之间数据和函数共享的问题,用一个类的不同对象的的静态成员使用同一个内存空间。静态成员包含静态数据成员和静态函数成员。

     通常,非static数据成员存在于类类型的每个对象中,但是static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不是与该类的对象关联。

     静态成员函数没有this形参,可以直接访问所属类的static成员,但是不能直接使用非static成员。

     使用静态成员的优点:(1)有利于类的封装,可以把static成员定义为私有成员,防止外部访问;(2static成员是与特定的类关联的,在外部必须使用类名字做前缀,程序更加清晰;(3static成员的名字是在类的作用域中,可以避免命名冲突。


(一)定义static成员
    static遵循正常的公有、私有访问限制。每一个要定义为static的成员前面都需要有static,这和访问限制不同。
     static成员函数可以直接定义在声明的后面,也可以在类的外面定义。当在类外面定义时,不需要static关键字。
  在静态成员函数中,不可以使用this指针,因为静态成员函数是同一个类所有对象共有的。同样静态成员函数中也不可以使用非静态的数据成员,只可以使用类的静态数据成员。
class Student
{
  public:
    static int getCount();
    static int count;
};

 和普通的数据成员不同,static数据成员必须在类定义体的外部定义并初始化,定义的时候必须要有类名所前缀。
int Student::count=0;

(二)使用static成员

  可以使用作用域运算符“::”从类直间调用static成员,或者通过对象、引用该类类型对象的指针间接调用。如可以使用下面的方法访问静态成员。

Student::count=0;
int n=Student::getCount();

  也可以通过类对象对静态成员进行访问:

Student stu1;
stu1.count=0;
Student *s=&syu1;
int n=s->getCount();

当在类的内部使用静态成员时,可以直接使用,不需要作用域运算符。此外可以使用非static成员的方法来使用static成员。

2.1 使用静态数据成员

#include<iostream>

using namespace std;

class Test

{

public:

static int n;

Test(int x)

{

k = x;

n++;

}

void disp()

{

cout << "n= " << n << ", k=" << k << endl;

}

private:

int k;

};

int Test::n = 0;

int main()

{

Test t1(10);

t1.disp();

Test t2(20);

t2.disp();

Test::n++;

t2.disp();

system("pause");

return 0;

}

2.2  使用静态成员函数

   静态成员函数可以直接引用该类的静态数据成员和成员函数,但不能引用非静态成员。如果要引用非静态成员,必须通过参数传递的方式得到对象名,再通过对象名来引用。使用静态成员函数要注意的问题:

  • 静态成员函数可以在类内定义,也可以在类外定义,在类外定义时不用再加关键字static;
  • 系统限定静态成员函数为内部连接,这样就不会因为与连接文件中的其他同名成员函数相冲突,保证了静态成员函数的安全性;
  • 静态成员函数中没有隐含this指针;
#include<iostream>
using namespace std;
class Dot
{
static int t;
int a, b;
public:
Dot(int x = 0, int y = 0)
{
a = x;
b = y;
t++;
}
Dot(Dot &d);
int geta()
{
return a;
}
int getb()
{
return b;
}
static void gett()
{
cout << "object id:" << t << endl;
}
};
Dot::Dot(Dot &d)
{
a = d.a;
b = d.b;
t++;
}
int Dot::t = 0;
int main()
{
Dot::gett();
Dot d1(2, 3);
cout << "Dot d1:" << d1.geta() << "," << d1.getb() << endl;
d1.gett();
Dot d2(d1);
cout << "Dot d2:" << d2.geta() << ", " << d2.getb() << endl;
Dot::gett();
system("pause");
return 0;

}



广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
LoneSurvivor 2018-02-25 08:26
C++输入/输出流(2)
1. get()函数#include<iostream>using namespace std;int main(){    char s1[80], s2[...
LoneSurvivor 2018-02-23 12:19
C++输入/输出流(1)
1. 输入/输出流类层次 C++的输入/输出流类库是用派生方法建立起的,它有2个平行的基类,streambuf和ios。其他的流类都是从这两个基类直接或间接派生的。1.1  ...
LoneSurvivor 2018-02-19 11:36
C++多态(4)——特殊运算符重载和类类型转换
1.“++”和“--”的重载     运算符“++”和“--”的重载要区分前置和后置两种形式。如果不区分前置和后置,则使用operator++()或operator—()即可...
LoneSurvivor 2018-02-12 11:15
C++多态(3)——运算符重载
1.     运算符重载的定义     运算符重载也是实现多态的一个重要手段。运算符重载实现的是编译时的多态,即静态多态性。C++预...
LoneSurvivor 2018-02-12 10:31
C++多态(2)——纯虚函数与抽象类
   抽象类是一种特殊的类,它提供了统一的操作界面。建立抽象类是为了多态地使用抽象类的成员函数。抽象类是包含纯虚函数的类。 1.    ...
LoneSurvivor 2018-02-11 16:24
C++多态(1)
1.     多态      多态是人类思维方式的一种直接模拟,多态性是指不同对象接收到相同的消息时,根据对象类的不同而产...
我要评论
0
2
广告
关闭 热点推荐上一条 /2 下一条