脑图展开
一般模型
具体案例(Qt,C++)
定义相关类,实现个人简历的初始化和拷贝工作,其中简历的数据成员包括:姓名、性别、年龄、任职时段、任职公司,以及用于观察浅拷贝的引用(指针)成员;
class ICloneable
{
public:
ICloneable();
virtual ICloneable *Clone()=0;//抽象的Clone 方法
ICloneable(QString id){
this->id=id;
}
QString getId(){
return id;
}
private:
QString id;
};
class Resume:public ICloneable
{
public:
Resume(){}
Resume(QString name){
this->name=name;
rhsTest=new QString;
}
//设置个人信息
void setPersonalInfo(QString sex,QString age){
this->sex=sex;
this->age=age;
}
//设置工作经历
void setWorkExperience(QString timeArea,QString company){
this->timeArea=timeArea;
this->company=company;
}
//设置引用对象
void setRhsObj(QString rhs){
*(this->rhsTest)=rhs;
}
//显示
void Display(){
};
ICloneable *Clone()
{
Resume *obj=new Resume(this->name);
obj->sex=this->sex;
obj->age=this->age;
obj->timeArea=this->timeArea;
obj->company=this->company;
obj->rhsTest=this->rhsTest;
return obj;
}
QString getName(){
return this->name;
}
QString getSex(){
return this->sex;
}
QString getTimeArea(){
return this->timeArea;
}
QString getCompany(){
return this->company;
}
QString getRhsObj(){
return *(this->rhsTest);
}
private:
QString name;
QString sex;
QString age;
QString timeArea;
QString company;
QString *rhsTest; // 对象的引用,浅拷贝
};
void Widget::myResume()
{
Resume *a=new Resume("徐念");
a->setPersonalInfo(ui->sexEdit->text(),ui->yearsEdit->text());
a->setWorkExperience(ui->timeEdit->text(),ui->companyEdit->text());
a->setRhsObj("rhsobj1");
Resume *b=(Resume*)a->Clone();
b->setWorkExperience("2016-2018","ABB");
b->setRhsObj("rhsobj2");
Resume *c=(Resume*)a->Clone();
c->setWorkExperience("2019-2020","苏州微软");
c->setRhsObj("rhsobj3");
Resume *&d=a;
// a->Display();
// b->Display();
// c->Display();
ui->showEdit->append(a->getName()+QString("\t")+a->getSex()+QString("\t")
+a->getTimeArea()+QString("\t")+a->getCompany()
+QString("\t")+a->getRhsObj());
ui->showEdit->append(b->getName()+QString("\t")+b->getSex()+QString("\t")
+b->getTimeArea()+QString("\t")+b->getCompany()
+QString("\t")+b->getRhsObj());
ui->showEdit->append(c->getName()+QString("\t")+c->getSex()+QString("\t")
+c->getTimeArea()+QString("\t")+c->getCompany()
+QString("\t")+c->getRhsObj());
delete a,b,c;
}
实现效果
运行结果分析
我们在myResume()函数的 Resume *&d=a;后面打个断点,观察a,b,c,d各个 Resume 对象的地址,注意看图中涂成青色的三个对象的地址,我们不难发现a和d的地址是一样的,这是因为d是变量a的一个引用,也就是别名,故他们指向的地址是一致的,即最终的数据是共享的,也就是说引用实际是浅拷贝。再看原始代码,我们定义了rhsTest这一指针对象,在实际进行拷贝过程中,我们只是简单的将当前类的rhsTest 赋值给了拷贝对象,而其所指向的值并没有一同复制,这样两者共享内存,最终实现的也是浅拷贝了。
代码
code
关于作者
长期从事编程相关研究,涉及Qt、机械臂、轮式机器人、四足机器人的建模及仿真,可共同探讨编程相关问题,可指导课程设计及毕业设计,详询:QQ:2963325158