对象的复制是在对象声明时进行的操作,而赋值是在声明之后的操作。一般而言,复制的语法为A a(b),A为类,b为已经定义的对象,a为复制b的对象;赋值的语法为A a;a = b;需要先声明对象a,之后再对其进行赋值。
有一种特殊的情况,A a=b;虽然是使用了操作符=,但由于是在对象声明时,进行定义,所以依然调用复制方法。
下面代码为对象的复制和赋值操作。
#include <iostream>
#include <string>
using namespace std;
class Dul_Ass
{
private:
int x;
string s;
public:
Dul_Ass (): x(1), s("abc") {};
Dul_Ass (int a, string c): x(a), s(c) {};
//对象复制
Dul_Ass(const Dul_Ass & src): x(src.x), s(src.s) {};
//对象赋值
Dul_Ass& operator = (const Dul_Ass &src);
//输出元素
void print_val() const;
};
//对象复制
Dul_Ass& Dul_Ass::operator = (const Dul_Ass& rhs)
{
//如果是自赋值,直接返回函数本身
if(this == &rhs)
return *this;
else
{
x = rhs.x;
s = rhs.s;
return *this;
}
}
void Dul_Ass::print_val(void) const
{
cout << "x = " << x << "; s = " << s << endl;
}
int main(void)
{
Dul_Ass a(2, "def");
Dul_Ass b(a);
Dul_Ass c;
c = a;
b.print_val();
c.print_val();
return 0;
}
对象复制:
Dul_Ass(const Dul_Ass & src): x(src.x), s(src.s) {};
不需要返回值,函数的输入参数为对象。
对象赋值:
Dul_Ass& operator = (const Dul_Ass &src);
相当于定义了一个“=”操作符,函数的返回类型为一个对象类型,并且还可以是引用返回(类内的函数可以,普通的函数调用不可以返回引用值)。为了减小字符值的资源浪费,进行了
//如果是自赋值,直接返回函数本身
if(this == &rhs)
return *this;
this指针指向调用该函数的对象。
一般而言,创建类时会默认创建复制,赋值方法,除非类方法中构造函数使用了指针,一般是不需要写复制,赋值方法的。