C++的引用参数问题

来源:百度知道 编辑:UC知道 时间:2024/06/30 13:17:47
operator =(Person &p)
{
cout<<"call operator override"<<endl;
name=new char[strlen(p.name)+1];
if(name!=0)
strcpy(name,p.name);
}
void main()
{
Person wang("wang");
Person li=wang;
li.printname();
}
这里为什么要用引用,如果将
operator =(Person &p)
改为operator =(Person p),会出现错误,为什么?
,两则有什么区别?

程序没给全,
Person li=wang;
这里创建了一个新对象
为的是从旧对象中引用一个新对象
如果不用引用的话
会实现的是一个位拷贝
编译器会默认拷贝的是它的地址而不是它的值
你可以看一下拷贝构造函数

以一个Person类为例子
首先定义一个Person类 并不实现其函数
Class Person{
public:
Person(const char *ch=NULL);//默认构造函数
Person(const Person &str);//拷贝构造函数
~Person(void);
Person &operator=(const Person &str);//赋值函数
private:
char *m_data;
};

位拷贝拷贝的是地址,而值拷贝则拷贝的是内容。如果定义两个Person对象A和B。A.m_data和B.m_data分别指向一段区域,A.m_data="Windows",B.m_data=“Linux";

如果未重写赋值函数,将B赋给A;则编译器会默认进行位拷贝,A.m_data=B.m_data

则A.m_data和B.m_data指向同一块区域,虽然A.m_data指向的内容会改变成"linux",但是这样容易出现这些问题:

(1):A.m_data原来指向的内存区域未释放,造成内存泄露。

(2):A.m_data和B.m_data指向同一块区域,任何一方改变都会影响另一方

(3):当对象被析构时,B.m_data被释放两次。

对于编译器,如果不主动编写拷贝函数和赋值函数,它会以“位拷贝”的方式自动生成缺省的函数。

如果重写赋值函数和拷贝构造函数后,

A.m_data=B.m_data,进行的是值拷贝,会将B.m_data的内容赋