thinking in c++ 读书笔记---name control

static的变量,如果没有初始化,如果是build in type的变量,会初始化为0,在转化到合适的类型,如果是用户定义的object,会调用默认的构造函数。

static变量的析构函数的调用时间:main()函数结束,或者显示调用exit()函数时。一般的实现里面,main()函数结束时都会调用exit()函数。 所以建议不要在类的析构函数里面调用exit()函数,容易造成死循环。

注意: 函数abort()调用时,不会调用static object 的析构函数。

下面写一个例子,说明static的奇特之处。

 

#include < iostream >
using   namespace  std;
class  A
{
    
static A a;
    
static int b;
    
int i;
    A(
int j):i(j){}
    A(
const A&);
public:
    
void print()
    
{
        cout
<<i<<endl;
    }

    
static A*instance(){
        
return &a;
    }

}
;
A A::a(
47 );
int  A::b = 5 ;
int  main()
{
//  A::a.print();//erorr ,priviate member.
    A::instance()->print();
    cout
<<"size="<<sizeof(*(A::instance()))<<endl;
    
return 0;
}

在上面这个例子中,class  A 很特别,因为他里面有一个static 的本身类的对象,而且他的构造函数都是私有的,所以他不能创建对象,但他生来就有一个对象,那就是他里面的静态的成员。这个静态的成员变量,也就是这个唯一的对象,因为是私有变量,在main函数里面需要用函数instance()来获取,这个函数必须是静态的,不然就不能用类的名字直接调用A::instance()。

在这个小程序里面有不少知识点:

1:类的静态成员变量的初始化(定义)很奇特,如上面这个,这个成员a是私有的,单却可以在类的外面直接定义,还可以调用类的私有构造函数,这在其他地方,都不可以。

2:类对象的大小。打印了一下 对象a的大小,很吃惊,竟然是4,只有int i的大小,一想也对,类中的静态成员变量虽然也占用内存,却不在对象里面。所以不影响类对象的大小。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值