类成员C++笔记六:static类成员总结,以及利用C++类static成员实现单例模式

文章结束给大家来个程序员笑话:[M]

           类的static成员      

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

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

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

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

           4.static成员函数没有static形参,所以不能直接拜访类的非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.2static成员不是任何对象的组成部份,所以static成员函数不能申明为const。因为将成员函数声明为const是承诺不会修改该函数所属的对象。而static成员函数连对应的对象都没有。

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

     

     

           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 invoked\n";
}
Sing* Sing::GetSingInstance(void)
{
	return psing;
}

    
 

     

     

          

     

文章结束给大家分享下程序员的一些笑话语录: 与女友分手两月有余,精神萎靡,面带菜色。家人介绍一女孩,昨日与其相亲。女孩果然漂亮,一向吝啬的我决定破例请她吃晚饭。
选了一个蛮贵的西餐厅,点了比较贵的菜。女孩眉开眼笑,与我谈得很投机。聊着聊着,她说:“我给你讲个笑话吧。”“ok”
  “一只螳螂要给一只雌蝴蝶介绍对象,见面时发现对方是只雄蜘蛛。见面后螳螂问蝴蝶‘如何?’,‘他长的太难看了’,‘别看人家长的丑,人家还有网站呢’。”
  “呵呵………”我笑。忽然她问:“你有网站吗?”  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值