c++赋值构造函数

jakzon_245 2012-11-29 12:43:14
在《introduction programmig with c++》(liang)一书中,有下面段代码(p326):


int main(){
Person person1(111,1970,5,3);
Person person2(person1);

cout<<"After creating person1 and person2"<<endl;
displayPerson(person1,person2);//copy person2 to person1

person2.getBirthDate()->SetYear(1963);


cout<<"\nAfter modifying person2's birthdate"<<endl;
displayPerson(person1,person2);

cout<<"\n"<<(person1.getBirthDate()==person2.getBirthDate());

Person person3(111,1970,5,3);
Person person4=person3;
//displayPerson(person3,person4);
cout<<'\n'<<(person3.getBirthDate()==person3.getBirthDate())<<endl;
return 0;
}


问题来了,在自己写了赋值构造函数的情况下,他说对于对象间的复制方式:
1.object1(object2),object2已经定义,这里会使用程序员定义的赋值构造函数

2.object1=object2,这里会发生浅复制,即若object1里有指针p,
则有object1.getp()==object2.getp()

注:我的程序倒数第二行改为了:
cout<<'\n'<<(person4.getBirthDate()==person3.getBirthDate())<<endl;
结果为0.估计他的倒数第二行写错了。。。所以想问问他说对了没有。求大侠们指正!
...全文
307 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jakzon_245 2012-12-01
  • 打赏
  • 举报
回复
话已至此,不结贴就太过分咯! 灰常感谢楼上,及楼上上上。。。
yisikaipu 2012-12-01
  • 打赏
  • 举报
回复
引用 12 楼 jakzon_245 的回复:
我只是觉得6楼的第18行代码应该输出1,因为看上去更像是在用默认=。
Person person4=person3; // 这里是拷贝构造,所以指针各自 new 过,不相等 cout<<'\n'<<(person3.getBirthDate()==person4.getBirthDate())<<endl; // 所以不相等 Person person4=person3; // 在此例中与 Person person4(person3); 完全等价 这里要强调在“此例中”,是因为两者还是有区别,只是那个区别在此例中体现不出来。但这个区别与赋值操作无关,也就是说,type ob2=ob1; 无论什么情况,都是拷贝构造,这里的等号与赋值无关。 如果想了解括号和等号的区别,可搜 直接(direct)初始化 和 拷贝(copy)初始化。再次强调,都是初始化,不是赋值
jakzon_245 2012-11-30
  • 打赏
  • 举报
回复
[quote=引用 11 楼 yisikaipu 的回复:] 简单例子,举一反三 呵呵,楼上是位细心的老师。 21,22行返回的分别是指针和值。 我只是觉得6楼的第18行代码应该输出1,因为看上去更像是在用默认=。
yisikaipu 2012-11-30
  • 打赏
  • 举报
回复
简单例子,举一反三
class Cls
{
public:
	Cls(int i):m(new int(i)){}
	~Cls(){delete m;}

	Cls(Cls& c):m(new int(*c.m)){}

	int* getm(){return m;}

private:
	int* m;
};


int main()
{
	Cls a(7);
	Cls b(a);	

	bool ans1=a.getm()==b.getm(); // false。知道这里为什么不等了吧
	bool ans2=*a.getm()==*b.getm(); // true

	return 0;
}
yisikaipu 2012-11-30
  • 打赏
  • 举报
回复
引用 6 楼 jakzon_245 的回复:
obj1=obj2是赋值行为,当未重载操作符‘=’时,程序调用“assignment copy operator = by default”(还是那本书),但当如此定义并赋值时为什么却用了自定义赋值构造函数?(如上代码的倒数第6行)
你的代码没有去重载=,而默认的=操作符就是把 Date *birthDate; 照搬过去,然后当然相等啊 另外,你就是不去 SetYear(1963); 结果也是不相等的,因为你比较的是日期的指针啊,不是1963那个日期 因为你的拷贝构造重新 new 过 birthDate,该指针必然不相等的
yisikaipu 2012-11-30
  • 打赏
  • 举报
回复
引用 8 楼 jakzon_245 的回复:
好吧。 有点小长~
没有重载赋值操作啊 Person operator=(Person&) 结果是 0 1 没问题嘛
jakzon_245 2012-11-30
  • 打赏
  • 举报
回复
引用 7 楼 yisikaipu 的回复:
把涉及到的全部代码贴出来吧
好吧。 Date类:

#ifndef DATE
#define DATE
class Date{
        public:
            Date(int year,int NewMonth,int NewDay);
            int GetYear();
            void SetYear(int);
            //~Date(){}
        private:
            int year;
            int month;
            int day;
};

#endif
//下面的执行在不同的文件,下同

#include"Date.h"

Date::Date(int NewYear,int NewMonth,int NewDay){
        year=NewYear;
        month=NewMonth;
        day=NewDay;
}

int Date::GetYear(){return year;}

void Date::SetYear(int NewYear){year=NewYear;}

person类:

#include"Date.h"

class Person{
      public:
            Person(int id,int year,int month,int day);
            Person(Person &person);
            Person();
            ~Person();
            int GetId();
            Date *getBirthDate();//return the pointer of the object
      private:
            int id;
            Date *birthDate;//the pointer of the object
};

//执行

#include"person1.h"
Person::Person(int id,int year,int month,int day){
        this->id=id;
        birthDate=new Date(year,month,day);
}

Person::Person(Person &person){
        id=person.id;
        Date *p=person.getBirthDate();
        birthDate=new Date(*p);
}

Person::Person():
        id(1),birthDate(0)
{}

int Person::GetId(){return id;}

Person::~Person(){delete birthDate;}


Date *Person::getBirthDate(){return birthDate;}

测试程序:

#include<iostream>
#include"person1.h"
using namespace std;

void displayPerson(Person &person1,Person &person2){
        cout<<"\tperson1 id: "<<person1.GetId()<<endl;
        cout<<"\tperson1 birth year: "<<
            person1.getBirthDate()->GetYear()<<endl;

        cout<<"\tperson2 id: "<<person2.GetId()<<endl;
        cout<<"\tperson2 birth year: "<<
            person2.getBirthDate()->GetYear()<<endl;
}

int main(){
    Person person1(111,1970,5,3);
    Person person2(person1);

    cout<<"After creating person1 and person2"<<endl;
    displayPerson(person1,person2);

    person2.getBirthDate()->SetYear(1963);

    cout<<"\nAfter modifying person2's birthdate"<<endl;
    displayPerson(person1,person2);

    cout<<"\n"<<(person1.getBirthDate()==person2.getBirthDate());

    Person person3(111,1970,5,3);
    Person person4;
    person4=person3;
    //displayPerson(person3,person4);
    cout<<'\n'<<(person3.getBirthDate()==person4.getBirthDate())<<endl;

    return 0;
}

有点小长~
yisikaipu 2012-11-29
  • 打赏
  • 举报
回复
把涉及到的全部代码贴出来吧
jakzon_245 2012-11-29
  • 打赏
  • 举报
回复
多谢各位相助!因我未将题意描述清楚,所以。。。。我再将自己的实验结果和理解贴上,希望有侠士能继续找bug.


int main(){
Person person1(111,1970,5,3);
Person person2(person1);

cout<<"After creating person1 and person2"<<endl;
displayPerson(person1,person2);

person2.getBirthDate()->SetYear(1963);

cout<<"\nAfter modifying person2's birthdate"<<endl;
displayPerson(person1,person2);

cout<<"\n"<<(person1.getBirthDate()==person2.getBirthDate());

Person person3(111,1970,5,3);
Person person4=person3;
//displayPerson(person3,person4);
cout<<'\n'<<(person3.getBirthDate()==person4.getBirthDate())<<endl;
person4=person3;
cout<<'\n'<<(person3.getBirthDate()==person4.getBirthDate())<<endl;

return 0;
}

我在倒数第二三行加了一个赋值操作,输出结果如下:


我对此的解释:如2,3楼所言,
obj1=obj2是赋值行为,当未重载操作符‘=’时,程序调用“assignment copy operator = by default”(还是那本书),但当如此定义并赋值时为什么却用了自定义赋值构造函数?(如上代码的倒数第6行)
type ob1=ob2;//感觉怪怪的。

再次说下,虽然这本书是一个中国血统的人用英语写的,但还是有几处错误。。。
jakzon_245 2012-11-29
  • 打赏
  • 举报
回复
引用 3 楼 pengyw 的回复:
displayPerson(person1,person2);//copy person2 to person1 这样的写法很菜啊,建议不要看这本书了
不好意思,这里的注释是我搞错了。
zfk198687 2012-11-29
  • 打赏
  • 举报
回复
没看过这本书。 不过看着这个程序的倒数第二行cout<<'\n'<<(person3.getBirthDate()==person3.getBirthDate())<<endl; 括号里面都是person3.getBirthDate(),单看这个,应该是写错了。
pengyw 2012-11-29
  • 打赏
  • 举报
回复
displayPerson(person1,person2);//copy person2 to person1 这样的写法很菜啊,建议不要看这本书了
彭家老三 2012-11-29
  • 打赏
  • 举报
回复
同意一楼。 type ob1; ob1=ob2; 这种才会有赋值。 type ob1=ob2;这种会调用拷贝构造函数。不一样。
yisikaipu 2012-11-29
  • 打赏
  • 举报
回复
尽管 type ob1(ob2); // 直接初始化 与 type ob1=ob2; // 复制初始化 不完全等价 但这里例子里,应该完全等价。都是初始化,调用拷贝构造函数,而没有赋值

64,674

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧