为什么模板类的定义需要放在头文件中?
无论是类模板还是函数模板,都是一个蓝图,本身不是一个类或函数,编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为模板的实例化。所以一般将模板类放在头文件中,在编译时,基于使用的具体对象的类别,生成对应的对象。
多态和模板类的联系?
继承语言特性带来的多态性,是程序运行时体现出来的,称为运行时多态性。
泛型编程的多态性,是在编译阶段体现的,称为编译时多态性。
malloc和new的区别是什么?
malloc 和 new 是在 C 和 C++ 中分配内存的两种方式,但它们有一些关键的区别:
-
malloc(C/C++):- 用法:
void* malloc(size_t size); malloc仅分配内存,不调用构造函数。如果分配的内存需要初始化,你需要手动完成。malloc返回一个void*指针,需要强制转换为目标类型。- 释放内存时,需要调用
free()。
- 用法:
-
new(C++):- 用法:
Type* ptr = new Type;或Type* ptr = new Type[size];(分配数组) new除了分配内存,还会调用对象的构造函数。new返回的指针已经是正确的类型,不需要强制转换。- 释放内存时,需要调用
delete或delete[],它会自动调用析构函数。
- 用法:
内存分配的类型
malloc: 在堆上分配原始内存块,不关心内存块内存储的内容。new: 在堆上分配内存,并且会自动初始化对象。
初始化
malloc: 不初始化分配的内存,内存中的内容是未定义的。new: 自动初始化内存,如果是基本数据类型,会被默认初始化为零(对于内置类型)或调用对象的默认构造函数(对于类类型)。
类型安全
malloc: 由于返回的是void*,需要手动进行类型转换,这可能会引入错误。new: 不需要类型转换,类型安全。
异常处理
malloc: 如果分配失败,会返回NULL,需要手动检查。new: 如果分配失败,会抛出std::bad_alloc异常。
兼容性
malloc: 是 C 语言标准库的一部分,可以在 C 和 C++ 中使用。new: 是 C++ 的关键字,仅在 C++ 中使用。
** 总结**
- 在 C 中,使用
malloc是标准的内存分配方式。 - 在 C++ 中,使用
new更加常见,因为它不仅分配内存,还会自动初始化对象,且更安全。