肆-拾肆|类对象作为类成员、explict、malloc、new和delete

类对象作为类成员

当其他类的对象作为本类成员,先构造其他类对象,在构造自身,析构的顺序和构造相反。

explict

class MyString
{
public:
	MyString(char * str)
	{
	
	}
	//explicit用途:防止利用隐式类型转换方式来构造对象
	explicit MyString(int len)
	{
		//通过使用explicit关键字
	}
};

void test01()
{


	MyString str1(10);//括号法

	MyString str2 = MyString(100);//显示法
	//括号法 显示法都可以 但是隐式法不行
	//MyString str3 = 10; // "10"

}

malloc

malloc:
程序员必须要确定对象的长度
malloc返回void指针,c++不允许将void分配给其它任何指针,必须强转
malloc可能申请内存失败,所有必须判断返回值来确保内存分配成功
用户在使用对象之前必须记住对他初始化,构造函数不能显示调用初始化(构造函数是由编译器调用)用户有可能忘记调用初始化函数。

malloc 和 new 区别

malloc 和 free 属于库函数 new 和delete属于 运算符
malloc不会调用构造函数 new会调用构造函数
malloc返回void* C++下要强转 new 返回创建对象的指针

void test01()
{
	Person * p = new Person;

	delete p;
}
//注意事项 不要用void*去接受new出来的对象,利用viod*无法调用析构函数
void test02()
{
	void * p = new Person;
	//相当于
	//Person* person=(Person*)malloc(sizeof(Person));
	//if(person == NULL)
	// {
	// 	return 0;
	// }
	// person->Init();

	delete (Person*)p;
} 

如何利用new开辟数组

void test03()
{
	//int * pInt = new int[10];
	//double * pD = new double[10];


	//堆区开辟数组,一定会调用默认构造函数
	Person * pPerson = new Person[10];
	//堆区开辟数组,一定会调用默认构造函数
	//Person * pPerson = new Person[10]{ Person(10), Person(20), Person(20) };有些编译器会报错
	释放数组的时候需要加[]
	//delete [] pPerson;


	//栈上开辟数组,可不可以没有默认构造:可以没有默认构造函数,但堆区可以
	//Person pArray[10] = { Person(10), Person(20), Person(20) };

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值