C++构造函数传值问题

firandiir 2011-01-15 03:13:48

// E_NotReturnRefOfPriData.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class address
{
public:
address();
address(string address);
address(const address &);
virtual ~address(){}
string get_address() const{return address_value;}
string *_w64 get_address_of_address_value(){return &address_value;}

//address &operator =(const address& add){ address_value=add.get_address();size=static_cast<unsigned int>(strlen(add.get_address().c_str()));return *this;}
friend ostream &operator <<(ostream &s,address &r);

private:
string address_value;
unsigned int size;
};

address::address()
{
address_value="empty address";
size=static_cast<unsigned int>(strlen(address_value.c_str()));
//试验string类自带的函数"size()"
}

address::address(string address)
{
if(address.empty())
{
address_value="empty address";
}
else
{
address_value=address;
}
size=static_cast<unsigned int>(strlen(address_value.c_str()));
//试验string类自带的函数"size()"
}
address::address(const address &Ref_address)
{
string address_value=Ref_address.get_address();
//试验string类自带的函数"size()"
}



//以下做法是错误的,虚函数必须在体内实现。
//详见微软官方解析:http://msdn.microsoft.com/en-us/library/68y53azf(VS.71).aspx
//virtual address::~address(){}

ostream &operator <<(ostream &s,address &r)
{
cout<<r.get_address()<<endl;
return s;
}


class person:public address
{
public:
person():person_address("China"),age(20),name("Cora"){}
//person(address person_address_val,int age_val,string name_val):person_address(person_address_val),age(age_val),name(name_val){}
person(address person_address_val,int age_val,string name_val)
{
person_address=person_address_val;
age=age_val;
name=name_val;
}

//复制构造函数缺省
~person(){}

//访问变量
address &get_person_address(){return person_address;}
string get_person_name(){return name;}
int get_person_age(){return age;}


friend ostream & operator <<(ostream &s,person &r);

private:
address person_address;
int age;
string name;
};

ostream & operator<<(ostream &s,person &r)
{
cout<<"Name:"<<r.get_person_name()<<endl;
cout<<"Age:"<<r.get_person_age()<<endl;
cout<<"Address:"<<r.get_person_address()<<endl;
return s;
}


int _tmain(int argc, _TCHAR* argv[])
{
person p1;
cout<<p1<<endl
;

address ad("China Shanghai");
person p2(ad,26,"Zhou Yanfei");

cout<<p2<<endl;
//address add1("");
//add1=s.
system("pause");
return 0;
}




输出的结果是:
Name:Cora
Age:20
Address:China


Name:Zhou Yanfei
Age:23
Address:

实在搞不懂第二个Address为什么是空的,在person的第二个构造函数设了断点,发现第一个参数ad的address_value是空的,size显示4268428,奇怪了,为什么值传不进去呢?

望高手赐教
...全文
245 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
firandiir 2011-03-10
  • 打赏
  • 举报
回复
都忘了结贴了,感谢各位的热心回帖,分不多,望笑纳
sxy050819 2011-01-27
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include <iostream>
#include <string>
#include <tchar.h>

using namespace std;

class address
{
public:
address();
address(string address);
address(const address &);
virtual ~address(){}
string get_address() const{return address_value;}
string* get_address_of_address_value(){return &address_value;}

//address &operator =(const address& add){ address_value=add.get_address();size=static_cast<unsigned int>(strlen(add.get_address().c_str()));return *this;}
friend ostream &operator <<(ostream &s,address &r);

private:
string address_value;
unsigned int size;
};

address::address()
{
address_value="empty address";
size=static_cast<unsigned int>(strlen(address_value.c_str()));
//试验string类自带的函数"size()"
}

address::address(string address)
{
if(address.empty())
{
address_value="empty address";
}
else
{
address_value=address;
}
size=static_cast<unsigned int>(strlen(address_value.c_str()));
//试验string类自带的函数"size()"
}
address::address(const address &Ref_address)
{
address_value=Ref_address.get_address();
//试验string类自带的函数"size()"
}



ostream &operator <<(ostream &s,address &r)
{
s<<r.get_address()<<endl;
return s;
}


class person:public address
{
public:
person():person_address("China"),age(20),name("Cora"){}
//person(address person_address_val,int age_val,string name_val):person_address(person_address_val),age(age_val),name(name_val){}
person(address person_address_val,int age_val,string name_val)
{
//person_address=person_address_val;
person_address=address(person_address_val);//也可//person_address=person_address_val;
age=age_val;
name=name_val;
}
//复制构造函数缺省
~person(){}

//访问变量
address &get_person_address(){return person_address;}
string get_person_name(){return name;}
int get_person_age(){return age;}


friend ostream & operator <<(ostream &s,person &r);

private:
address person_address;
int age;
string name;
};

ostream& operator<<(ostream &s,person &r)
{
s<<"Name:"<<r.get_person_name()<<endl;
s<<"Age:"<<r.get_person_age()<<endl;
s<<"Address:"<<r.get_person_address()<<endl;
return s;
}


int _tmain(int argc, _TCHAR* argv[])
{
person p1;
cout<<p1<<endl;

address ad("China Shanghai");
person p2(ad,26,"Zhou Yanfei");
cout<<p2<<endl;

system("pause");
return 0;
}


/*****************我在VC6.0下调试过了 大哥 *****************/
maoxing63570 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 haohaizijhz 的回复:]
我觉得可能是重载输出符<<时出了问题;

ostream &operator <<(ostream &s,address &r)
{
cout<<r.get_address()<<endl;
return s;
}
里面不应该再用了cout了,应该用s;
你试试这个s<<r.get_address()<<endl;return s;
[/Quote]
呵呵,姐笑而不语……
  • 打赏
  • 举报
回复
我觉得可能是重载输出符<<时出了问题;

ostream &operator <<(ostream &s,address &r)
{
cout<<r.get_address()<<endl;
return s;
}
里面不应该再用了cout了,应该用s;
你试试这个s<<r.get_address()<<endl;return s;
GrayMole2010 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 firandiir 的回复:]

楼上的说的对了
我这样写:string address_value
是不是被编译器看成一个普通变量了,而不是address的成员变量了。
[/Quote]

是的,这样address_value被认为是函数的局部变量,而不是类的成员变量.
除非使用this->address_value显式指定类的成员变量.
不过,建议不要使用相同的变量名.
  • 打赏
  • 举报
回复
拷贝构造实现写错了

address::address(const address &Ref_address)
{
string address_value=Ref_address.get_address();
//试验string类自带的函数"size()"
}

改为
address::address(const address &Ref_address)
{
address_value=Ref_address.get_address();
//试验string类自带的函数"size()"
}


maoxing63570 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 firandiir 的回复:]
楼上的说的对了
我这样写:string address_value
是不是被编译器看成一个普通变量了,而不是address的成员变量了。
[/Quote]
就是这个意思了
maoxing63570 2011-01-15
  • 打赏
  • 举报
回复
address::address(const address &Ref_address)
{
address_value=Ref_address.get_address();
//试验string类自带的函数"size()"
}

把前面的string去掉,如果你加上这个的话,局部的会隐藏类中的那个,最后的结果就是你改变了局部的那个,但是你没有改变类中的那个,这个的结果就是最的那个Address没打印的原因了,因为局部的,函数完就销毁了
firandiir 2011-01-15
  • 打赏
  • 举报
回复
meitbe 还在吗
就这一问,完了就结贴
firandiir 2011-01-15
  • 打赏
  • 举报
回复
楼上的说的对了
我这样写:string address_value
是不是被编译器看成一个普通变量了,而不是address的成员变量了。
meitbe 2011-01-15
  • 打赏
  • 举报
回复
cout<<"Address:"<<r.get_person_address()<<endl;
这个是没有二义性。原因"<<" 是左连接的,并且都返回 "cout"的引用。"<<"右边的都只是 "cout"的参数


address::address(const address &Ref_address)
{
string address_value=Ref_address.get_address();
// 这里错了 去掉 "string"
//试验string类自带的函数"size()"
}





address::address(const address &Ref_address)
{
string address_value=Ref_address.get_address();
//试验string类自带的函数"size()"
}


firandiir 2011-01-15
  • 打赏
  • 举报
回复
关于重载二义性,能讲具体些吗?

我感觉问题不是出在这里,首先了,我使用第一个构造函数的时候,输出是没有问题的。在生成P2的时候就出问题了,ad变量传递到person构造函数中的时候,值已经不是“China Shangai”了,是空值。
bluesky12312388 2011-01-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hnuqinhuan 的回复:]

存在二义性
cout<<"Address:"<<r.get_person_address()<<endl;
重载的 << 有二义性
[/Quote]
+1
無_1024 2011-01-15
  • 打赏
  • 举报
回复
存在二义性
cout<<"Address:"<<r.get_person_address()<<endl;
重载的 << 有二义性

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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