类有默认的构造函数、拷贝构造函数、析构函数、赋值操作运算符=和取地址运算符&.
默认的赋值操作运算符和默认的拷贝构造函数类似,对于每个非static成员,都是执行逐个成员赋值(memberwise assignment),同时也是按位赋值(bitwise copy).即,只是简单地将每个类成员的内存中的直接拷贝到对应的新的类的成员当中。
那么,什么时候需要赋值操作符,什么时候需要拷贝构造函数呢?当用一个对象实例去初始化另一个对象时,需要拷贝构造函数;当将一个对象实例赋值给另外一个已经初始化过的对象实例时,需要赋值操作运算符。所以说,虽然他们二者功能有点类似,但是各自有自己使用的地方,各有各的用途。
c++有默认"+"号操作符,但是只是针对普通的内置数据类型,如果浮点数,整形数。而对于类类型的话,类是没有默认的"+"号操作
符的。所以,类如果要想用加号操作符,就只能是自己去重载c++默认"+"号操作符了。
class Point{
public:
friend Point operator+(const Point& a, const Point& b);
};
int main(){
Point a,b;
a + b;
operator+(a,b);
Point c = a; -----这里是调用默认的拷贝构造函数,并不是看到"="就是赋值操作哦
b = a; ------这里是调用默认的赋值操作运算符
}
c++其实把操作符也看成是与函数同样性质的实体了。因此,可以对操作符进行函数那样的定义,之后,就可以自由地使用操作符了。
人们通常习惯将操作符放在两个操作数的中间,所以c++采用了人性化的设计,编译器会将表达式a+b转译为operator+(a,b),对函数的调用.
操作符可以重载为类的友元函数,也可以重载为类的成员函数。但是有些操作符只能是重载为类成员函数,如赋值操作符。
下面三种对象需要调用拷贝构造函数
1) 一个对象作为函数参数,以值传递的方式传入函数体
2) 一个对象作为函数返回值,以值传递的方式从函数返回
3) 一个对象用于给另外一个对象进行初始化