we know you can define constructor and the copy constructor for a user defined class, and if you faile to provide one, the compiler will be able to generate one for you. The generated ones are called default constructor or default copy constructor, the former will call the default constructor for its member and its base classes, and the later will call the default memberwise copy constructor for its member if the member failes to provide one or the copy constructor if it has provided one, and its applies the same as regard to the base classes object parts.
but how it works if we are create a array of user define classes or a container like vector of user defined classes?
let's see an example.
#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using std::string;
using std::cout;
using std::endl;
using std::vector;
using std::copy;
using std::inserter;
class CustomClass
{
public:
CustomClass(string name_, int age_) : name(name_), age(age_) {
cout << "inside CustomClass(string name, int age)" << endl;
}
CustomClass(const CustomClass& rhs) : name(rhs.name), age(rhs.age) {
cout << "inside CustomClass(const CustomClass& rhs)" << endl;
}
private:
std::string name;
int age;
};
void TestVectorCopy()
{
//vector<CustomClass> customClasses(4) =
// the results shows that it will first call the constructor with (string, int), then with the const CustomClass& - the copy constructor
CustomClass customClasses[] = { CustomClass("joe", 29), CustomClass("Yun", 30), CustomClass("Cliff", 31), CustomClass("Nora", 31), CustomClass("Tom", 30) };
vector<CustomClass> v_customClasses;
v_customClasses.reserve(sizeof(customClasses) / sizeof(CustomClass));
// as you can see, there are in total const CustomClasses& called when copy from the CustomClass[] to the vector<CustomClass>
copy(customClasses, customClasses + 4, inserter(v_customClasses, v_customClasses.begin()));
// as you will find in the following code, another CustomClasses is called
vector<CustomClass> v_customClasses2 = v_customClasses;
vector<CustomClass> v_customClasses3;
v_customClasses.reserve(v_customClasses2.size());
copy(v_customClasses.cbegin(), v_customClasses.cend(), inserter(v_customClasses3, v_customClasses3.begin()));
}
the result shows that copy constructor is called for each element of container, and the constructor is called for each of the initializer value of the first array.
本文通过示例展示了C++中用户定义类的构造函数和拷贝构造函数的工作原理,特别是当这些类作为数组元素或容器内容存在时的行为。
6859

被折叠的 条评论
为什么被折叠?



