为什么模板类的定义需要放在头文件中?
无论是类模板还是函数模板,都是一个蓝图,本身不是一个类或函数,编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为模板的实例化。所以一般将模板类放在头文件中,在编译时,基于使用的具体对象的类别,生成对应的对象。
多态和模板类的联系?
继承语言特性带来的多态性,是程序运行时体现出来的,称为运行时多态性。
泛型编程的多态性,是在编译阶段体现的,称为编译时多态性。
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
更加常见,因为它不仅分配内存,还会自动初始化对象,且更安全。