2012-01-09 88 views
0


我对C++中的代码示例有点疑问。在C++中创建对象

vector<Cat> v; 
Cat c; 
v.push_back(c); 
Cat d = v[0]; 

在这一段代码,有多少个对象被创建?

+6

这是功课吗? – 2012-01-09 04:10:06

+2

你对对象的总数量感兴趣吗,或者只是'Cat'对象的数量?例如,你想计算'v'作为一个对象,还是只计算*'v'中的'Cat'对象? – 2012-01-09 04:12:38

+4

这是不可能说的。 Cat的默认构造函数是做什么的?它是否构建其他对象?它可以抛出异常吗?它可以调用'std :: exit()'吗?那么'Cat'拷贝构造函数呢?它有什么作用?如何使用'std :: vector'的实现?它尝试的任何分配可能会失败吗?还需要计算子对象吗? – 2012-01-09 04:13:10

回答

1

至少有三个:

vector<Cat> v; 
Cat c; // default construction 
v.push_back(c); // copy construction of v[0] from c 
Cat d = v[0]; // copy construction of d from v[0] 

编辑:请注意,我只算Cat对象在这里,因为它没有任何意义要问多少个对象创建,因为那将是实现具体(如何std::vector实现的是什么Cat办......?)

1

一些记录添加到猫的构造和测试它自己:

class Cat 
{ 
    Cat() 
    { 
    std::cout<<"Constructing a Cat"<<std::endl; 
    } 
    Cat(const Cat & cat) 
    { 
    std::cout<<"Copy Constructing a Cat"<<std::endl; 
    } 
}; 

这里就是我得到:http://codepad.org/Pzs9kOlH

需要注意的是在一定条件下的编译器就可以去除什么也不做的代码块。所以一些副本可能会被删除。用假想的非常积极的编译器,它可能会注意到你的代码没有做任何事情,并完全剥离了任何这样的构造。由于我的构造函数现在改变了输出,编译器不那么自由地去除对它们的调用。