一般构造函数不是私有或者保护成员,但构造函数可以使私有成员函数,在一些特殊的场合,会把构造函数定义为私有或者保护成员。
C++类的构造函数一般不应该是私有函数,因为私有函数不能被其他类或者全局函数所使用。而创建C++实例需要调用构造函数。
所以如果构造函数是私有函数的话,除了类自己的方法之外,其他类不能构造这个类的实例。一般来说,类做出来就是让其他类使用的,而使用一个类必须先构造它的实例。所以一般情况下,构造函数如果是私有函数,其他类要使用它就很困难了。
构造函数为私有的类有这样的特点:
e.g
最常见的应用是单件,就是一个类只有一个实例,为了避免其他类创建多个实例,把构造函数定义为私有的:
#include <iostream>
using namespace std;
class Singlton
{
private:
static Singlton * _insatnce;
Singlton()
{
cout<<"object is ["<<this<<"] do construction"<<endl;
}
public:
~Singlton()
{
cout<<"object is ["<<this<<"] do destruction"<<endl;
_insatnce = 0;
}
static Singlton * getSinglton()
{
if(_insatnce)
return _insatnce;
_insatnce = new Singlton;
return _insatnce;
}
void dosomething()
{
cout<<"object is ["<<this<<"] do something"<<endl;
}
};
Singlton * Singlton::_insatnce = NULL;
void foo(int i)
{
if(i)
Singlton::getSinglton()->dosomething();
}
int main()
{
foo(1);
delete Singlton::getSinglton();
}
....
//output:
object is [003B35E0] do construction
object is [003B35E0] do something
object is [003B35E0] do destruction
为什么要把getInstance声明为static?
因为如果不声明为static的话,外部必须要有一个Singleton对象才能调用其getInstance函数。但是如果不调用getInstance函数,外部就无法获得对象。这样就形成了一个死结。
声明为static则没有这个问题,可以直接根据类的名字(而不是类的对象)来调用getInstance函数。
如果getInstance函数不是static,必须像下面这样调用:
Singleton s;
s.getInstance();
如果getInstance函数是static,可以像下面这样调用:
C++类的构造函数一般不应该是私有函数,因为私有函数不能被其他类或者全局函数所使用。而创建C++实例需要调用构造函数。
所以如果构造函数是私有函数的话,除了类自己的方法之外,其他类不能构造这个类的实例。一般来说,类做出来就是让其他类使用的,而使用一个类必须先构造它的实例。所以一般情况下,构造函数如果是私有函数,其他类要使用它就很困难了。
构造函数为私有的类有这样的特点:
<1>不能实例化:因为实例化时类外部无法访问其内部的私有的构造函数;
<2>不能继承:同<1>;
所以它可以控制用户实例化一个类对象。
e.g
最常见的应用是单件,就是一个类只有一个实例,为了避免其他类创建多个实例,把构造函数定义为私有的:
#include <iostream>
using namespace std;
class Singlton
{
private:
static Singlton * _insatnce;
Singlton()
{
cout<<"object is ["<<this<<"] do construction"<<endl;
}
public:
~Singlton()
{
cout<<"object is ["<<this<<"] do destruction"<<endl;
_insatnce = 0;
}
static Singlton * getSinglton()
{
if(_insatnce)
return _insatnce;
_insatnce = new Singlton;
return _insatnce;
}
void dosomething()
{
cout<<"object is ["<<this<<"] do something"<<endl;
}
};
Singlton * Singlton::_insatnce = NULL;
void foo(int i)
{
if(i)
Singlton::getSinglton()->dosomething();
}
int main()
{
foo(1);
delete Singlton::getSinglton();
}
....
//output:
object is [003B35E0] do construction
object is [003B35E0] do something
object is [003B35E0] do destruction
为什么要把getInstance声明为static?
因为如果不声明为static的话,外部必须要有一个Singleton对象才能调用其getInstance函数。但是如果不调用getInstance函数,外部就无法获得对象。这样就形成了一个死结。
声明为static则没有这个问题,可以直接根据类的名字(而不是类的对象)来调用getInstance函数。
如果getInstance函数不是static,必须像下面这样调用:
Singleton s;
s.getInstance();
如果getInstance函数是static,可以像下面这样调用:
Singleton::getInstance();
进一步完善中
借鉴blog:
http://xudacheng06.blog.163.com/blog/static/489414332011416112135541/
http://www.cnblogs.com/my_life/articles/2356709.html
http://blog.sina.com.cn/s/blog_674b9ded0100u6rh.html