创建类的对象有两种方式
一、声明类指针并且new初始化。
类指针的声明也可以不new即初始化为空。说说new和不new的区别吧:
初始化为NULL的类指针可以安全调用不涉及类成员变量的类非虚函数成员函数而不出错,但是如果类成员函数中调用了类成员变量则会出错,因为NULL的情况下this指针是空的,成员变量都是通过this去调用,this是空的自然就会出错,虚函数因为要用this去计算虚函数指针找虚函数表,会dump掉,
所以虚函数也是不能调用的。既然赋值为NULL的情况都可以使用,那么自然不初始化的类指针同样满足这类情况。
但是正常情况的初始化是要new一个对象进行初始化的。
另外说一下单例模式中虽然禁用了构造函数析构函数拷贝构造运算符重载等函数,但是依然可以声明空类指针,依然可以调用类里面未使用成员变量的方法。不过这不影响单例模式的使用,因为单例模式只需要保证全局只有一个new出来的对象,保证某些操作不被多次使用,而指向NULL的类指针并不能操作带有成员变量的方法。
二、声明类实例而非指针对象。
这个方法与上面不同,例如类Singleton的声明:
Singleton sig;
这样的声明是存在于栈里,程序运行前就已经分配了内存空间,系统自动释放,无需手动释放。类指针是存在堆里,程序运行时分配内存空间,所以需要释放。
针对以上两种放拷贝构造函数的调用:
一、类指针初始化调用拷贝构造函数。
Singleton* sig6= new Singleton(msg);//msg是对象值而不是地址也不是指针。
二、普通类对象实例初始化时调用拷贝构造函数。
Singleton sig(msg);
注:单例模式使用类指针创建对象是可以在运行时分配内存,可以节省不必要的空间浪费。