问题 B: 向量2(友元及拷贝构造)
时间限制: 1 Sec 内存限制: 128 MB
题目描述
在题目向量1的代码上添加类CVector的友元函数Add,计算两个向量的和(对应分量相加)。
Add定义如下:
CVector Add(const CVector V1,const CVector V2) //函数头不可修改。
主函数输入数据,生成两个向量对象V1,V2,调用Add(V1,V2).print()输出向量V1+V2的计算结果。(假设print()为CVector类中的输出函数。)
可根据需要,为类CVector添加拷贝构造函数及其它成员函数。
输入
第一行,输入测试次数t
每组测试数据格式如下:
向量维数n
第一个n维向量值
第二个n维向量值
输出
对每组测试数据,输出两个n维向量与它们的和
样例输入
2
3
1 2 3
4 5 6
5
1 2 3 4 5
-1 2 4 6 10
样例输出
1 2 3
4 5 6
5 7 9
1 2 3 4 5
-1 2 4 6 10
0 4 7 10 15
提示
Solution:
关于友元函数:一个函数A,为了方便地读取类B内的数据,只需在类B中声明该友元方法。
关于拷贝构造函数:
class A{ A(A &a){}//拷贝构造函数 };
#include<iostream>
using namespace std;
class CVector{
private:
int *data;
int n;
public:
CVector(){
n = 5;
//data = new int[5]{0,1,2,3,4};
data[0] = 0;data[1] = 1;data[2] = 2;data[3] = 3;data[4] = 4;
}
CVector(int n1,int* a){n = n1; data = a;}
CVector(CVector &c);
~CVector(){delete data;}
void print(){
cout<<data[0];
for(int i =1;i<n;i++){
cout<<" "<<data[i];
}
cout<<endl;
};
friend CVector Add(const CVector V1,const CVector V2); // 加 friend 声明友元函数
};
CVector::CVector(CVector &c){
//拷贝构造函数
n = c.n;
data = new int[n];
for(int i =0;i<n;i++)
data[i] = c.data[i];
}
CVector Add(const CVector V1,const CVector V2){ // 实际定义友元函数时无需加上类名
int *d = new int[V1.n];
for(int i =0;i<V1.n;i++){
d[i] = V1.data[i] + V2.data[i];
}
CVector nc(V1.n,d);
return nc;
//return CVector(V1.n,d);这样写oj会报错
}
int main()
{
int t;
cin>>t;
while(t--){
int n;
cin>>n;
int *a = new int[n];
int i;
for(i = 0;i<n;i++)
cin>>a[i];
CVector c1(n,a);
c1.print();
int *b = new int[n];
for(i = 0;i<n;i++)
cin>>b[i];
CVector c2(n,b);
c2.print();
Add(c1,c2).print();
}
return 0;
}