说说创建类和声明类的几种方式和不同(由单例模式引发的疑问)

创建类的对象有两种方式

一、声明类指针并且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);

 

注:单例模式使用类指针创建对象是可以在运行时分配内存,可以节省不必要的空间浪费。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值