类对象作为类成员
当其他类的对象作为本类成员,先构造其他类对象,在构造自身,析构的顺序和构造相反。
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) };
}