拷贝构造函数:
创建对象时,使用同一类中的对象初始化新创建的对象。
拷贝构造函数形式:
classname (const classname& obj)
{
//
}
其中obj是对象引用,用于初始化另一个对象
形参为什么是const和引用?
1.const:防止意外修改实参,保护程序安全。
2.引用:防止对象初始化新的对象时,循环调用拷贝构造函数。
假设拷贝构造函数为classname (const classname obj)形式
classname a;
classname b=a;//调用拷贝构造函数
在调用拷贝构造函数时,const classname obj=a;又是用一个对象初始化新的对象。
因此obj又将调用拷贝构造函数,const classname obj=a(obj为新的对象,与上一个obj不同);循环递归调用拷贝构造函数,导致栈溢出。
赋值函数:
一个类的对象向该类的另一个对象赋值。对象已经存在。
形式:classname& operator(const classname &obj)
//赋值函数
A a;
A b;
b=a;
//拷贝构造函数
A a;
A b=a;
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
class A
{
public:
A()
{
cout<<"constructor"<<endl;
}
A(int x):data(x)
{
cout<<"constructor with argument"<<endl;
}
A(const A &x)
{
cout<<"copy constructor"<<endl;
cout<<"x="<<&x<<endl;
}
A& operator=(const A &x)
{
data=x.data;
cout<<"operator"<<endl;
}
int data;
};
int main(){
A a(2);
cout<<"a="<<&a<<endl;
//A b(a);
//cout<<"b="<<&b<<endl;
//A c=(a);
//A b(6);
A b;
A c;
b=c;
cout<<b.data<<endl;
return 0;
}