免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1982 | 回复: 8
打印 上一主题 下一主题

[C++] 关于类的函数问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-24 16:46 |只看该作者 |倒序浏览
这是书上的程序,有两个问题,请朋友大侠指点赐教。谢谢!(注:编译器是dev-c++4.9.9.2,不排除在6.0上可以正常运行,但在6.0中能运行的在这个编译器也可以运行吧?)
#include<iostream>
using namespace std;
class Point
{
      public:
             Point(int x=0,int y=0) {X=x;Y=y;}
             Point(Point &p);
             int getX(){return X;}
             int getY(){return Y;}
      private:
              int X,Y;
};
Point:oint(Point &p)
{
X=p.X+100;
Y=p.Y+100;
cout<<"拷贝构造函数被调用"<<endl;
}
void fun1 (Point p)
{cout<<p.getX()<<endl;}
Point fun2()//问题1:这个函数的是什么意思?(我知道其作用是返回类的对象)它不是类内的函数,并且函数声明不是这样子的啊
{
Point A(1,2);
return A;
}
int main()
{
Point A(4,5);
Point B(A);
cout<<B.getX()<<endl;
fun1(B);//直到这里还是正确的,结果是104和204
B=fun2();//问题2:到了这里编译器就提示出现错误说: no matching function for call to `Point:oint(Point)' ,不明其意
cout<<B.getX()<<endl;
system("pause";
return 0;
}

论坛徽章:
0
2 [报告]
发表于 2009-04-24 20:34 |只看该作者
应该可以这样调用
Point C = fun2()

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2009-04-25 14:15 |只看该作者
T的复制构造函数签名是:
T(const T& other);

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
4 [报告]
发表于 2009-04-25 23:02 |只看该作者

回复 #1 中国可爱小牛 的帖子

Point(Point &p);  这个不是严格的复制构造函数的签名, 应该改为:
Point(const Point &p);

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
5 [报告]
发表于 2009-04-27 01:32 |只看该作者
原帖由 OwnWaterloo 于 2009-4-25 14:15 发表
T的复制构造函数签名是:
T(const T& other);
原帖由 OwnWaterloo 于 2009-4-25 23:02 发表
Point(Point &p);  这个不是严格的复制构造函数的签名, 应该改为:
Point(const Point &p);


更正, 上面说错了……
对T:
T(const T&);
T(T&);
都是合法的拷贝构造函数签名。

它们甚至可以同时出现:
class T {
T(const T&);
T(T&);
};

只是通常使用的是 T(const T&);而已。
std::auto_ptr是个例外, 它需要从被复制的auto_ptr对象上强夺被指向对象的所有权。



上面不能通过编译的真正原因是:
Point fun2();                // 返回的是一个右值
Point::Point(Point&);   // 而引用无法绑定到右值上

fun2();                         // 单独调用fun2是可以的


更直接说明这个问题的一个例子:
int f();
int& ri = f(); // 是不行的。
const int& cri = f(); // 才可以


修改Point::Point(Point&)为 Point::Point(const Point&);是一种作法。
也可以修改fun2 使其返回引用。

Point& fun2() {
    static Point A(1,2);  // 注意不要返回局部自动变量的引用
    return A;
}

B = fun2();  // 就ok


当然, fun2这样实现是否还有意义就不知道了……

论坛徽章:
0
6 [报告]
发表于 2009-04-29 15:38 |只看该作者

回复 #1 中国可爱小牛 的帖子

Point C = fun2()

论坛徽章:
0
7 [报告]
发表于 2009-04-29 23:01 |只看该作者

回复 #6 handsomezhi 的帖子

抱歉了,这两天很忙。感谢两位朋友,我后来在6.0中调试了(由于自己的机上没有这软件,所以吃了不少苦)。在那里是没有问题的,在DEV-C++中就不能通过(第一次见这种情况)。
Point fun2()//问题1:这个函数的是什么意思?(我知道其作用是返回类的对象)它不是类内的函数,并且函数声明和定义不是这样子的啊
这个问题还是没有得到回答。小牛驽钝。朋友不要笑话,因为我一直在努力。

论坛徽章:
0
8 [报告]
发表于 2009-04-29 23:04 |只看该作者

回复 #5 OwnWaterloo 的帖子

不见怪,我的教材是清华大学的(第三版)郑莉 (著),里面就有很多死程序。其实我要求得有点苛刻,有些程序可能是增强其可读性,仅仅是为了说明一些语法规则而已。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2009-04-30 10:58 |只看该作者
原帖由 中国可爱小牛 于 2009-4-29 23:01 发表
Point fun2()//问题1:这个函数的是什么意思?(我知道其作用是返回类的对象)它不是类内的函数,并且函数声明和定义不是这样子的啊

楼主太纠结了 ……

这就是一个普通的, 返回一个Point的函数。
并不因为它返回的是Point, 所以这个函数就必须是Point的成员(成员函数或者静态成员函数)。

除了“返回一个Point, 函数内部可能会调用Point的一些public成员”,该函数可以和Point没有任何其他关系。

[ 本帖最后由 OwnWaterloo 于 2009-4-30 11:00 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP