我是靠谱客的博主 傲娇帽子,最近开发中收集的这篇文章主要介绍C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

       类的static成员      

       类的成员变量和成员函数都可以声明为static。

       1.类的static成员是属于类的,为所以该类的实例对象共享但不是某个对象的组成部分。不管有没有创建、创建了多少类的实例,static成员存在且只存在一份拷贝。

       2.static成员同样受访问权限的约束。

       3.可以通过作用域操作符从类直接访问static成员,或者通过对象、引用或指向该类类型的指针间接访问。

       4.static成员函数没有this形参,所以不能直接访问类的非static成员,可以直接访问类的static成员。

 

          static成员的声明和定义         

          static成员变量是类中声明,类外定义。static成员函数可以把声明和实现都放在类中,也可以把实现放到类外。

      1.static成员的声明只需要在成员声明的最前面加上static关键字就行。(声明加static)

      2.static成员变量在类外的定义和初始化或成员函数在类外的实现都不能也不需加static关键字。(定义不加static)否则编译器会报错:error:cannot delare member function to have static linkage

 

      static成员变量

      static成员变量可用于统计和控制类的实例数量。可用于实现单例模式。

      1.static成员变量必须在类定义的外部定义一次(且只能是一次)。

      2.static成员不能通过构造函数初始化(因为static成员变量不属于某个实体对象),而应该在定义时初始化。

      保证对象正好定义一次的最好办法,就是将static数据成员的定义放在包含类的非内联成员函数定义的文件中。

          double Account::interestRate = initRate();

      这里initRate()为静态成员函数,尽管initRate()是私有的,我们还是可以用它来初始化initerestRate。

       3.一般非static成员的类型不能是该成员所属类类型,否则会在初始化时无限递归。而static成员变量的类型可以是该成员所属的类类型。(反正是static成员,只有一份拷贝,不会无限递归)

 

       特殊的整型const static成员

       前面说过类的static成员变量和普通成员变量一样,不能在类的定义体中初始化。必须在类定义体外初始化。而整型const static成员变量时一个例外。

       1.只要初始化是一个常量表达式,整型const static成员变量可以在类的定义体中进行初始化。

       2.用常量值初始化的整型const static变量是一个常量表达式。可以用在任何需要常量表达式的地方。

       3.const static成员变量在类的定义中初始化后,仍然必须在类的定义体外定义一次(不必再指定初值了)。

 

      static成员函数

      1.static成员函数在类体中的声明需要指定static关键字,但在类体外的定义无需重复指定static。

      2.static成员函数的使用规则牢记一点:static成员函数没有this形参,它是属于整个类的,而不是某个对象的组成部分。

       2.1 所以在static成员函数中不能直接访问非static成员。(非static成员会显示或隐式的使用this指针)

       2.2 static成员不是任何对象的组成部分,所以static成员函数不能申明为const。因为将成员函数声明为const是承诺不会修改该函数所属的对象。而static成员函数连对应的对象都没有。

       2.3 static成员函数不能声明为虚函数。(等到虚函数部分再讲解)

 

 

       C++用static成员实现单例模式(Singleton pattern)

       步骤:

           1.把类的默认构造函数权限设为私有;

       2.用一个私有的static成员变量来保存指向这个唯一实例的指针;

       3.用一个私有的static成员函数来初始化2中的实例指针;(相当于私有的构造函数)

       4.提供一个公开的static函数用来获得指向唯一实例的指针;

示例如下:

class Sing
{
private:
	Sing();                                   //构造函数设私有
	static Sing* Instance(void);
	static Sing*psing;
public:
	static Sing* GetSingInstance(void);
};

Sing* Sing::psing = Instance();//只会执行一次

Sing* Sing::Instance(void)
{
	return new Sing;
}
Sing::Sing()
{
	cout<<"Sing constructor invokedn";
}
Sing* Sing::GetSingInstance(void)
{
	return psing;
}


 

 

 

      

 

最后

以上就是傲娇帽子为你收集整理的C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式的全部内容,希望文章能够帮你解决C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部