襄阳门户网

搜索
襄阳门户网 襄阳门户 企业宣传 查看内容

热点:C++什么是静态成员变量,如何定义静态成员变量?Linux C++第57讲2022/7/22 13:0 ...

2022-7-22 13:05| 发布者: 天若有情| 查看: 84| 评论: 0

摘要:   如果定义了一个student类,定义 3 个student类的对象,如下:hcie认证https://www.spoto.net/hcie/1484.html思博SPOTO网络工程师培训官网,专注华为思科认证培训18年,被誉为华为思科网络工程师摇篮学校,官方授 ...
网站出售

  如果定义了一个student类,定义 3 个student类的对象,如下:hcie认证https://www.spoto.net/hcie/1484.html思博SPOTO网络工程师培训官网,专注华为思科认证培训18年,被誉为华为思科网络工程师摇篮学校,官方授权认证机构,CCIE、CCNP、CCNA培训、HCNA、HCIA、HCIP培训、HCNP、HCIE,是全球IT技术人才在线培训基地,欢迎咨询400-829-6069!

  student stud1, stud2, stud3;

  那么,每一个student类对象都分别有自己的成员变量,而不同对象的成员变量各自有值,互不相干。但是,有时人们希望有一个或几个成员变量为所有对象所共有。这样,可以实现数据共享。

  学习C语言时已经了解了全局对象,它能够实现数据共享。如果在一个程序文件中有多个函数,在每一个函数中都可以改变全局变量的值。全局变量的值为各个函数共享,但是,用全局变量时安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶到失误,全局变量的值就被修改,导致程序错误。因此,在实际工作中很少使用全局变量。

  如果想在同类的多个对象之间实现数据共享,也不要用全局对象,可以用静态的成员变量。使用静态成员变量,实现数据共享。

  静态成员变量是一种特殊的成员变量。它以关键字static开头,用static关键字来修饰的一种成员变量,例如:

  class student

  {

  public:

  char name[32">; //姓名

  char addr[32">; //家庭地址

  static long long number; //电话号码

  public: //以下部分是公有部分

  student(char* pn, char* pa)

  {

  strcpy(name, pn);

  strcpy(addr, pa);

  }

  void print() const

  {

  cout << "name=" << name << endl;

  cout << "addr=" << addr << endl;

  cout << "number=" << number << endl;

  }

  };

  此时,在student类中定义的number成员变量,就是“静态成员变量”。每个student类对象中的number的值都是一样的,把它定义为静态成员变量,这样它就为各对象所共有,而不只属于某个对象的成员,所有对象都可以引用它。

  静态的成员变量在内存中只占一份空间(而不是每个对象都分别为它保留一份空间)。每个对象都可以引用这个静态成员变量。所有同类对象的静态成员变量的值都是一样的。如果改变它的值,那么,在各个对象中这个成员变量的值都同时改变了。这样,可以节省空间,提高效率。

  静态成员变量是属于类,而不是属于某个独立对象。N个独立的对象,共享一个静态成员变量。

  如下是一个测试例子:

  可以看到,student类定义number成员是static类型。在类外给number成员初始化。然后,在stud对象中修改number成员的值。

  然后,输出stud1对象的信息,得到的stud1. number成员变量是stud.number设置的值。所以,stud, stud1对象是共享static类型的number成员变量。

  静态成员变量可以初始化,但只能在类体外进行初始化。如:

  long long student::number=xxx26572996; //在类体外对静态成员变量赋值

  其一般形式为:

  数据类型 类名::静态成员变量名=初值;

  不必在初始化赋值语句中加 static。

  注意:不可以在构造函数的参数初始化表中对静态成员变量初始化,例如:

  student(char* pn, char* pa, int n):number(n)

  {

  strcpy(name, pn);

  strcpy(addr, pa);

  }

  在构造函数中,对static类型的number成员进行初始化,是错误的操作。

  如果未对静态成员变量赋值,则编译系统会自动赋初值为0。

  如果一个成员变量定义为const类型,同时,也是static类型,那么,应该怎么样初始化?有如下的分析:

  (1) static类型的成员变量,需要在类外进行初始化;

  (2) const类型的成员变量,需要在构造函数的初始化列表进行初始化;

  那么,const类型的static成员变量,不可以在构造函数的初始化列表中进行初始化,例如:

  提示 student::number成员变量是static类型,仅仅在定义的时候可以初始化。所以,不可以在构造函数列表中初始化。所以,在类外对static类型的成员变量进行初始化,程序测试代码如下:

  举报/反馈

路过

雷人

握手

鲜花

鸡蛋

文热点