C++ C++;标准向量内容范围 类示例1 { 私人: int i; 公众: 示例1(){i=1;} int getI(){return i;} }; 课堂示例2 { 公众: 示例2(){} 这个向量不会编译(3); 向量theVec; void addVec() { //这个范围是什么? //向后推会创建指针吗 //其中包含example1实例的深度副本 //是否执行构造函数返回的? 向量向后推(例如2()); } }; int main() { 例2:例; 可以访问example.theVec[0];//范围中example1的实例。 返回0; }

C++ C++;标准向量内容范围 类示例1 { 私人: int i; 公众: 示例1(){i=1;} int getI(){return i;} }; 课堂示例2 { 公众: 示例2(){} 这个向量不会编译(3); 向量theVec; void addVec() { //这个范围是什么? //向后推会创建指针吗 //其中包含example1实例的深度副本 //是否执行构造函数返回的? 向量向后推(例如2()); } }; int main() { 例2:例; 可以访问example.theVec[0];//范围中example1的实例。 返回0; },c++,scope,stdvector,C++,Scope,Stdvector,嗨,我想了解使用std::vectors的底层内存操作。上面的例子是我过去如何使用它们,而没有质疑它是如何实现的 当addVec()函数结束时,example2()构造函数返回一个超出范围的实例,那么vec如何添加它,同时保持它在范围内的时间与vec一样长呢 另外,为什么在类中声明std::vector具有恒定大小会产生编译器错误,以及如何避免这种错误?addVec中的push_back操作将构造的对象复制到其内部内存中。原件超出了范围并被销毁 非编译部分没有意义。没有恒定大小的向量。这就是st

嗨,我想了解使用std::vectors的底层内存操作。上面的例子是我过去如何使用它们,而没有质疑它是如何实现的

当addVec()函数结束时,example2()构造函数返回一个超出范围的实例,那么vec如何添加它,同时保持它在范围内的时间与vec一样长呢


另外,为什么在类中声明std::vector具有恒定大小会产生编译器错误,以及如何避免这种错误?
addVec
中的
push_back
操作将构造的对象复制到其内部内存中。原件超出了范围并被销毁


非编译部分没有意义。没有恒定大小的
向量。这就是
std::array
的用途。

当您调用
theVec.push_back(例如2())
该向量创建了example2临时实例的副本,该副本被传递到
push_back
。这将使用类的复制构造函数完成,编译器将自动生成该类,因为您尚未显式创建一个

我不完全确定您对声明一个大小恒定的
std::vector
有什么要求<根据定义,code>std::vector
没有恒定的大小。但是,您可以通过如下方式定义构造函数,以初始大小构造它:

class example1
{
    private:
    int i;
public:
    example1(){i = 1;}
    int getI(){return i;}
};

class example2
{
public:
    example2(){}
    vector<example2> this_vector_wont_compile(3);
    vector <example2> theVec;
    void addVec()
    {
        //what's the scope of this?
        //does push_back create a pointer
        //to which a deep copy of the example1 instance
        //returned by the constructor is performed?
        theVec.push_back(example2());
    }
};
int main()
{
    example2 theExample;
    theExample.theVec[0]; //can be accessed, instance of example1 in scope.
    return 0;
}
类示例2
{
例2():theVec(10){};
std::vectortheVec;
....
}

谢谢pmr和@obmarg,这完美地回答了我的问题。
class example2 
{
    example2() : theVec( 10 ) {};
    std::vector< example2 > theVec;
    ....
}