thinking in c++ 读书笔记---name control
2007-03-06 15:48
344 查看
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的大小,一想也对,类中的静态成员变量虽然也占用内存,却不在对象里面。所以不影响类对象的大小。
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的大小,一想也对,类中的静态成员变量虽然也占用内存,却不在对象里面。所以不影响类对象的大小。
相关文章推荐
- thinking in c++之Name control
- 读书笔记-thinking in c++ -常量
- Thinking in C++读书笔记--5.3缺省参数
- 读书笔记-Thinking in C++-第15章 多态和虚函数
- 读书笔记-Thinking in C++-第11章 引用和拷贝构造函数
- <<Thinking in C++>> Edition2 Voloum1 读书笔记
- 读书笔记-Thinking in C++-第7章 函数重载和默认参数Function Overloading &Default Arguments
- Thinking in C++ 读书笔记 之抽象数据类型
- thinking in c++ 读书笔记---const
- thinking in c++ 读书笔记---operator overloading
- [读书笔记]Thinking in C++
- Thinking in C++第2版第一卷读书笔记
- Thinking in C++读书笔记--7.2指针常量
- Thinking in C++ 读书笔记(A)
- thinking in c++ 读书笔记:c与c++之区别
- thinking in c++ 读书笔记---集合初始化
- Thinking In C++ 读书笔记
- 读书笔记-Thinking in C++-第14章 继承和组合
- thinking in c++ 读书笔记---友元函数的一个问题
- thinking in c++读书笔记--类的静态数据成员的定义的连接属性:外部连接属性