类的重载问题
为什么在自己写=重载的时候,形参有的需要加const(必须),有的却可要可不要对于一个类来说,编译器要自动声明这些函数。但一般如果程序员主动声明了,编译器就不再管了。
构造函数和析构函数一般会提的比较多,但其实也有很多细节不为人所知。我在此也不赘述。其它两个我提几句:
拷贝构造函数:
类 A 的拷贝构造函数是指接受参数为该类的引用 A&,或者是带 cv修饰符 的引用(指 const A&, volatile A& 或者 const volatile A&)。如果还带其它参数,则其它参数必须是默认参数,比如 A(A&, int=1)。
程序代码:
class A { public: A(); A(const A&, int = 1); }; A a; // 默认构造函数 A b(a, 0); // 拷贝构造函数 A c = b; // 拷贝构造函数
不过拷贝构造函数也有一定的限制,比如可以用非 cv 限定的对象初始化 cv 限定的对象,但不能反过来。这条限制与 c++ 中的一般赋值限制是一致的:即可以用低级的(或限制少的)对象给高级对象赋值,但不能反过来。想想用 int 给 double 赋值没问题,但 double 给 int 赋值会有警告的道理。
程序代码:
class A { public: A(); A(A&); // 只有非 cv 限定的拷贝构造函数 }; A a; // 默认构造函数 const A b = a; // 没问题,低向高拷贝 A c = b; // error,不能用 cv 限定的初始化非限定。这种必须要有 A(const A&) 才可以。
拷贝赋值操作符(copy assignment operator):
拷贝赋值操作符是指 operator=,并且只一个参数,类型为 A, A&, 或者带 cv 限定的 A&。
它虽然不是构造/析构函数(因此这个函数要有返回值),但也是一个特殊函数。(注意,在构造一个对象时即使使用 =,也是调用拷贝构造函数,我在之前的例子里已经大量展示了)
拷贝赋值操作符也有同样的限制,A& operator=(A&) ,是一个合法的重载,但不能用于拷贝 cv 限定的对象。
关于这些特殊成员函数,还有一些值得注意的地方是当程序员没有声明它们的时候,编译器隐式声明函数原型是什么样子。这与类的基类以及类的数据成员都有关系,并不是如想像的那么简单。
楼主说的有时需要加,有时不需要的区别,楼主还要再细心体会一下。