C++ C++;唯一的ptr初始化
我有个问题。让我们看看下面的代码:C++ C++;唯一的ptr初始化,c++,initialization,C++,Initialization,我有个问题。让我们看看下面的代码: #include <iostream> #include <string> #include <memory> class Writable { public: virtual ~Writable() = default; virtual void write(std::ostream& out) const = 0; }; class String : public Writable { pub
#include <iostream>
#include <string>
#include <memory>
class Writable {
public:
virtual ~Writable() = default;
virtual void write(std::ostream& out) const = 0;
};
class String : public Writable {
public:
String(const std::string& str) : m_str(str) {}
virtual ~String() override = default;
virtual void write(std::ostream& out) const override { out << m_str << '\n'; }
private:
std::string m_str;
};
class Number : public Writable {
public:
Number(double num) : m_num(num) {}
virtual ~Number() override = default;
virtual void write(std::ostream& out) const override { out << m_num << '\n'; }
private:
double m_num;
};
int main() {
std::unique_ptr<Writable> str1(new String("abc"));
std::unique_ptr<Writable> num1(new Number(456));
str1->write(std::cout);
num1->write(std::cout);
}
#包括
#包括
#包括
类可写{
公众:
virtual~Writable()=默认值;
虚空写入(std::ostream&out)常量=0;
};
类字符串:公共可写{
公众:
字符串(const std::String&str):m_str(str){}
virtual~String()override=默认值;
虚空写入(std::ostream&out)常量重写{out
std::unique_ptr<Writable> str1(new String("abc"));
std::unique_ptr str1(新字符串(“abc”);
如果构造函数被标记(如在构造函数中),则需要这种形式的初始化
explicit
构造函数以std::unique\u ptr str1=new String(“abc”);的形式禁用
std::unique_ptr<Writable> str1(new String("abc"));
std::unique_ptr str1(新字符串(“abc”);
如果构造函数被标记(如在构造函数中),则需要这种形式的初始化
显式
构造函数以std::unique_ptr str1=new String(“abc”);
的形式禁用这里您正在创建一个新的unique_ptr
并使用new
操作符返回的原始指针初始化
std::unique_ptr<Writable> str1(new String("abc"));
然而,编译器可以(最有可能)执行move-elison并使上述两个操作等效
下面是从c++14及更高版本初始化的正确方法
std::unique_ptr<Writable> v1 = std::make_unique<String>();
std::unique_ptr v1=std::make_unique();
在这里,您正在创建一个新的唯一\u ptr
并使用new
运算符返回的原始指针进行初始化
std::unique_ptr<Writable> str1(new String("abc"));
然而,编译器可以(最有可能)执行move-elison并使上述两个操作等效
下面是从c++14及更高版本初始化的正确方法
std::unique_ptr<Writable> v1 = std::make_unique<String>();
std::unique_ptr v1=std::make_unique();
就像你能写的一样
std::vector<int> foo(10);
创建一个指向新字符串(“abc”)
的std::unique_ptr
。这与执行相同
std::vector<int> foo = std::vector(10);
std::vector foo=std::vector(10);
及
std::unique_ptr str1=std::unique_ptr(新字符串(“abc”);
但后面的情况使用复制初始化
为了节省打字时间,您可以使用
auto str1 = std::make_unique<String>("abc");
auto str1=std::使_唯一(“abc”);
相反,当你声明你的唯一的\u ptr
时,就像你可以写的那样
std::vector<int> foo(10);
创建一个指向新字符串(“abc”)
的std::unique_ptr
。这与执行相同
std::vector<int> foo = std::vector(10);
std::vector foo=std::vector(10);
及
std::unique_ptr str1=std::unique_ptr(新字符串(“abc”);
但后面的情况使用复制初始化
为了节省打字时间,您可以使用
auto str1 = std::make_unique<String>("abc");
auto str1=std::使_唯一(“abc”);
相反,当您声明您的唯一\u ptr
时