1、使用C#语言,比较简单,使用私有的构造方法和公有的静态方法返回静态实例。在C#中,赋值的时候,基本类型是整体拷贝,引用类型是复制引用。
2、使用C++语言,有几个地方需要注意:
a、编译器会自动生成copy构造方法和copy复制操作符,从而导致生成多个实例。为了解决这个问题,声明私有的copy构造方法和copy复制操作符,但是不定义。通过继承noncopyable是个好办法,noncopyable中声明了私有的copy构造和copy赋值,并且构造方法是protected。子类会继承父类的所有成员,只不过是不能访问父类的私有成员。
b、静态构造方法返回引用没有问题,如果返回指针,需要考虑什么时候释放内存。正确的做法是,RAII资源获取就初始化,使用share_ptr包装返回的实例指针。
3、在C#中 Person p = new Person(); 包括三个过程:①定义Person类型的变量,变量名为p;②在托管堆上分配一个Person对象;③变量p指向分配的Person对象。相对于C++,p是一个弱化的指针,强化的引用。为什么?
a、C++中的指针可以做加减操作,这里的p不可以;
b、C++中的引用必须初始化,而且不能指向其他对象,这里的p允许不初始化,同时可以指向其他对象。
4、语句 Person p;
在C++中,表达的意思是:在栈上定义对象,必定会调用构造方法。
在C#中,定义一个Person类型的变量p,p指向null