Code Bye

容器与容器元素的复制构造函数

class CTest
{
public:
	CTest(int i) : value(i)	{}
public:
	int value;
private:
	CTest(const CTest &tem)	{}
};
vector<CTest> vecTest(10, CTest(-1));//这句话不能通过编译

问题一:
如上代码,为什么vector<CTest> vecTest(10, CTest(-1));不能通过编译?
当将类的复制构造函数的访问权限变为public的时候就能通过编译为什么?

class CTest
{
public:
	CTest(int i) : value(i)	{}
	CTest(const CTest &tem)	{}
public:
	int value;
private:
};
vector<CTest> vecTest(10, CTest(-1));
vecTest.emplace_back(0);
vecTest.emplace_back(1);//结果:前10个元素值是无意义的,然后是0, 1

问题二:为什么前10个元素的值是无意义的?

class CTest
{
public:
	CTest(int i) : value(i)	{}
	CTest(const CTest &tem)	{}
public:
	int value;
private:
};
vector<CTest> vecTest;
vecTest.emplace_back(0);
 vecTest.emplace_back(1);//vecTest = [2]({value=-842150451 },{value=1 })

问题三:为什么vecTest 第一个元素值是无意义的值?

解决方案

5

1.
vector (size_type n, const value_type& val,
const allocator_type& alloc = allocator_type());
内部实现就是复制10,修改为private复制啥.
2. lz复制构造函数啥都不写复制啥
3. 同上

5

私有拷贝构造函数 ,权限的原因不能调用
还没有 operator =

10

问题一:原因是vector初始时会进行对象复制,你复制构造函数设置为私有则无法进行对象复制
问题二三,复制构造函数中要加上 value = tem.value,或直接不要写复制构造函数(使用默认的)

10

class CTest
{
public:
	CTest(int i) : value(i)    {}
	CTest(const CTest &tem)    {value = tem.value;}
public:
	int value;
private:
};

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明容器与容器元素的复制构造函数