构造函数如何初始化vector<unique_ptr<Student>> vec
时间: 2023-10-29 13:06:07 浏览: 178
假设 `Student` 是一个类,可以使用以下代码初始化 `vector<unique_ptr<Student>> vec`:
```c++
vector<unique_ptr<Student>> vec;
// 添加元素到 vec 中
vec.push_back(make_unique<Student>("John"));
vec.push_back(make_unique<Student>("Jane"));
vec.push_back(make_unique<Student>("Bob"));
```
在上述代码中,我们使用了 `make_unique` 函数来创建 `unique_ptr` 对象并将其添加到 `vec` 中。注意,在使用 `make_unique` 函数时,需要传递 `Student` 类的构造函数所需的参数。这里我们假设 `Student` 类的构造函数接受一个 `const string&` 类型的参数。
相关问题
vector<unique_ptr>
vector<unique_ptr>是一个存储unique_ptr的动态数组,其中每个元素都是一个unique_ptr对象,每个对象都拥有独特的所有权。unique_ptr是一个智能指针,它提供了对动态分配对象的所有权和管理。当unique_ptr超出范围时,它将自动删除其所拥有的对象。下面是一个vector<unique_ptr>的例子:
```cpp
#include <iostream>
#include <vector>
#include <memory>
int main() {
std::vector<std::unique_ptr<int>> vec;
vec.push_back(std::make_unique<int>(1));
vec.push_back(std::make_unique<int>(2));
vec.push_back(std::make_unique<int>(3));
for (const auto& ptr : vec) {
std::cout << *ptr << " ";
}
// 输出:1 2 3
return 0;
}
```
关于std::unique_ptr的使用的原则、要求和建议? A. Func(unique_ptr<Foo>(new Foo()), Bar()); B. auto ptr = std::make_unique<MyClass>(0, 1); C. Func(make_unique<Foo>(), Bar()); D. std::unique_ptr<MyClass> ptr(new MyClass(0, 1));
关于std::unique_ptr的使用,有一些原则、要求和建议如下:
1. 避免使用裸指针直接初始化unique_ptr。建议使用std::make_unique或者std::unique_ptr的构造函数来初始化unique_ptr,这样可以更好地管理资源的生命周期。
2. 使用std::make_unique来创建unique_ptr。std::make_unique是C++14引入的函数模板,能够在动态内存分配和对象构造之间提供更强的异常安全性。因此,在C++14及以上版本中,推荐使用std::make_unique来创建unique_ptr。
3. 尽量使用初始化列表初始化unique_ptr。这样可以避免在构造函数体中进行资源分配,并且可以保证异常安全性。
基于上述原则和要求,对于给出的选项,正确的选择是B和C。
选项A中,使用了unique_ptr的构造函数直接初始化,这种方式不够安全。
选项D中,使用了裸指针直接初始化unique_ptr,同样不够安全。
因此,建议选择B或C中的方式来使用std::unique_ptr。
阅读全文