首先,这是代码:
#include <iostream>
#include <algorithm>
using namespace std;
class Array
{
int* arr;
int n;
public:
Array();
Array(const Array&);
Array(Array &&);
Array& operator=(const Array&);
Array& operator=(Array &&);
void print();
~Array();
};
Array::Array()
{
cout<<"No of elements: "<<endl;
cin>>n;
if(n!=0)
{
arr = new int [n];
cout<<"\nInsert values:"<<endl;
for_each(arr, arr+n, [](int x){cin>>x;});
}
}
Array::Array (const Array& a)
{
int i=0;
this->n=a.n;
arr= new int [n];
for(i=0;i<n;i++)
arr[i]=a.arr[i];
}
Array::Array (Array &&a)
{
this->n=a.n;
arr=a.arr;
a.arr=nullptr;
}
Array& Array::operator=(const Array& a)
{
int i=0;
this->n=a.n;
arr= new int [n];
for(i=0;i<n;i++)
arr[i]=a.arr[i];
return *this;
}
Array& Array::operator=(Array &&a)
{
this->n=a.n;
arr=a.arr;
a.arr=nullptr;
return *this;
}
void Array::print()
{
for_each(arr, arr+n, [](int a){cout<<a;});
}
Array::~Array()
{
n=0;
delete [] arr;
}
int main()
{
Array a;
Array b;
Array c=a;
Array d;
d=b;
c.print();
cout<<endl;
d.print();
return 0;
}
因此,正如您所看到的,我创建了默认构造函数(如果没有参数的构造函数可以称为默认构造函数),则使用for_each循环创建一个数组,并将lambda函数用作第三个参数,正如您所看到的那样它接受我插入的值并将其放置为变量x的值,该值应从arr [0]到arr [n-1]。
但是,当我打印在main中创建的任何数组时,它只打印零,这不是由于复制构造函数引起的,因为我尝试打印数组a和b并发生了相同的事情(请注意,在这种情况下,我是打印出c和d,因为它们分别是a和b的副本)。
我还试图查看它是否正常工作,因为我试图在for_each循环完成后立即打印出数组的某些元素,结果证明for_each循环对数组没有影响,因为即使在循环之后它也保持为零。
任何帮助表示赞赏!
答案 0 :(得分:6)
使用for_each
循环时,您传递的是lambda
for_each(arr, arr+n, [](int x){cin>>x;});
但是lambda (int x)
的参数表示您正在创建数组元素的副本,将为其分配值。当您离开lambda的主体时,该副本将被销毁,而数组内部的原始值保持不变。
将其更改为
for_each(arr, arr+n, [](int& x){cin>>x;});
那样,您将不会在数组内部创建值的副本,但是会传递对其的引用,这意味着您会将值写入数组。