Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我使用向量来保存对象,是否需要复制构造函数?_C++ - Fatal编程技术网

C++ 如果我使用向量来保存对象,是否需要复制构造函数?

C++ 如果我使用向量来保存对象,是否需要复制构造函数?,c++,C++,以下是一个例子: #ifndef CPP_PRACTICE_ACCOUNTS_H #define CPP_PRACTICE_ACCOUNTS_H #include <string> #include <utility> class Accounts { private: /* variables */ std::string email, password, displayName,

以下是一个例子:

#ifndef CPP_PRACTICE_ACCOUNTS_H
#define CPP_PRACTICE_ACCOUNTS_H
#include <string>
#include <utility>

class Accounts
{
private:
    /* variables */
    std::string email,
                password,
                displayName,
                dateOfBirth;

    /* invariant */
    bool accountCreated;

    /* other */
    static int objectCount;

    /* private functions */
    void greeting() const;
    bool InvalidEmail();
    bool InvalidPassword();
    bool InvalidDOB();

public:
    Accounts();

    /* constructor used to create an account */
    Accounts(std::string email, std::string password, std::string dateOfBirth);

    /* throws error if invariant isn't established */
    class InvalidAccount{};

    /* getters */
    const std::string &getEmail() const;
    const std::string &getPassword() const;
    const std::string &getDisplayName() const;

    /* setters */
    void setDisplayName(const std::string &displayName);
    void setPassword(const std::string &password);

    /* other */
    static int getObjectCount();

};

#endif //CPP_PRACTICE_ACCOUNTS_H

//in main
int main()
{
    std::vector<Accounts> accounts;
    
    //create account objects and
    //push_back to the vector

    return 0;
}   

如果我将复制/移动构造函数和复制/移动赋值运算符全部添加到向量中,是否需要将它们添加到Accounts类中?我问是因为我知道向量是按值复制的,但我想知道是否所有的东西都能被正确复制。谢谢大家!

直到C++11,std::vector中的模板参数T必须满足可复制可分配和可复制可构造的要求

在C++11之后,这就放松了,这取决于对向量使用了什么操作

例如,在您的案例中,如果在需要复制的地方没有对向量进行任何操作,那么就不需要复制

例如:


在C++11之前,std::vector中的模板参数T必须满足可复制可分配和可复制可构造的要求

在C++11之后,这就放松了,这取决于对向量使用了什么操作

例如,在您的案例中,如果在需要复制的地方没有对向量进行任何操作,那么就不需要复制

例如:


@假设这不是重复的,这是关于向量中使用的类型,而不是相反。哦,你说得对,我的错。取决于成员变量的细节。如果你有指针,你可能需要一个复制构造函数和其他。如果没有,可能没有。我完全理解了。谢谢。你是在问你的类型是否需要复制/移动构造函数,还是需要编写一个?编译器将为您生成一个,如果可以,是否可以以及默认生成的构造函数是否正确取决于帐户的详细信息,请提供一个不重复的@cigien,这是关于向量中使用的类型,而不是相反。哦,你是对的,我的错误。取决于成员变量的详细信息。如果你有指针,你可能需要一个复制构造函数和其他。如果没有,可能没有。我完全理解了。谢谢。你是在问你的类型是否需要复制/移动构造函数,还是需要编写一个?如果可以,编译器将为您生成一个,是否可以,以及默认生成的构造函数是否正确取决于帐户的详细信息,请提供一个我不知道的副本构造函数,如果我初始化了向量,则需要一个副本构造函数谢谢!使用push_back要求对象是可复制的。如果改为使用emplace_back,则不需要它。它仍然需要一个移动构造函数realloc@ChrisDoddpush_back不需要移动值,如果初始化向量,inI不知道需要复制构造函数,谢谢!使用push_back要求对象是可复制的。如果改为使用emplace_back,则不需要它。它仍然需要一个移动构造函数realloc@ChrisDodd如果将值移入,则“向后推”不需要这样做
#include <vector>

class Accounts
{
public:
    Accounts() = delete; // explicitely delete default constructor
    Accounts(const Accounts&) = delete; // explicetly delete copy ctor
};

//in main
int main()
{
    std::vector<Accounts> accounts;  // no need for copy or default ctor here, because no copy used and no object created
    // std::vector<Accounts> accounts(3); // error: now default constructor is needed
    
    //create account objects and
    //push_back to the vector - requires copy ctor
    // emplace_back - doesnt require copy ctor


    return 0;
}