| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 275 人关注过本帖
标题:类的重载问题
只看楼主 加入收藏
chinawide
Rank: 1
等 级:新手上路
帖 子:13
专家分:2
注 册:2013-1-21
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
类的重载问题
为什么在自己写=重载的时候,形参有的需要加const(必须),有的却可要可不要
2013-01-21 17:28
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:20 
默认构造函数,拷贝构造函数,拷贝赋值操作符 和 析构函数 都是特殊成员函数。
对于一个类来说,编译器要自动声明这些函数。但一般如果程序员主动声明了,编译器就不再管了。
构造函数和析构函数一般会提的比较多,但其实也有很多细节不为人所知。我在此也不赘述。其它两个我提几句:

拷贝构造函数:
类 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 限定的对象。

关于这些特殊成员函数,还有一些值得注意的地方是当程序员没有声明它们的时候,编译器隐式声明函数原型是什么样子。这与类的基类以及类的数据成员都有关系,并不是如想像的那么简单。

楼主说的有时需要加,有时不需要的区别,楼主还要再细心体会一下。
2013-01-22 09:46
快速回复:类的重载问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015309 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved