首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 帮我看个程序 关于const和& [已结贴,结贴人:mazhjn]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mazhjn
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-22 01:35:39 楼主
    #include <iostream.h>

    double fun(double &a)  //为什么这里改成(const double &a)才可以编译通过,否则不行
    {
    return a*a*a;
    }

    int main()
    {
    int c=2;
    double x=fun(c);
    cout < <"x=" < <x < <endl;
    return 0;
    }

    //error C2664: 'fun' : cannot convert parameter 1 from 'int' to 'double &'
            //A reference that is not to 'const' cannot be bound to a non-lvalue
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • Zark
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 02:18:461楼 得分:0
    这里牵涉默认转换和优化的问题,你的问题到底是什么?想写一个型参为double但能兼容int的函数?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • richbirdandy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 02:39:332楼 得分:10
    double fun(double &a)  //为什么这里改成(const double &a)才可以编译通过,否则不行

    double x=fun(c);
    c是int类型 这里涉及到隐式类型转换
    常引用会 这里产生一个临时对象
    而非常引用不能 标准禁止非常引用产生临时对象

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • brookmill
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 05:30:503楼 得分:0
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yuhaozx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 07:30:514楼 得分:0
    1、
      隐式类型转化,产生了临时对象,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nirendao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 07:42:355楼 得分:0
    和double是8字节,int是4字节是否有关系呢?我去试试看。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nirendao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 07:53:426楼 得分:0
    int a=10;
    const double & d=a; //ok
    double & dd = a; //error

    即使const引用产生了临时对象,如:double tmp=(double)a; 然后将d指向了tmp,但tmp在本句结束也析构了呀,怎么d会不产生问题呢?请高手解释下。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yshuise
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 07:59:187楼 得分:0
    我想常量有存放的地址,而那个临时变量经过编译器优化以后,就像宏定义一样没有地址。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ztz0223
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 08:47:318楼 得分:10
    int c=2;
    double x=fun(c);
    这个是一般的书里面都指明了的
    引用和指针一样是不能转型的
    你的int到double的引用转型明显就不对
    但是加上const的可以了
    这里有一个隐式转换的问题,
    int c=2;
    double dd = c //临时变量,而且const的引用可以引用临时变量
    double x=fun(c);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ztz0223
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 08:48:199楼 得分:0
    补充上面,应该是
    double x=fun(dd);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • freedom0203
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:09:3810楼 得分:0
    引用和指针不支持隐式转型么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • matthous
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:01:2211楼 得分:0
    引用 4 楼 yuhaozx 的回复:
    1、
      隐式类型转化,产生了临时对象,
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:07:2912楼 得分:0
    哦,明白~学习了!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • digimon
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:12:2513楼 得分:0
    把c改成double的不好吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • e_sharp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:16:4714楼 得分:0
    int c=2;
    double x=fun(c);
    需要隐式转换,但是C++不会对 非常量引用 产生 临时变量
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wjb_yd
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:25:3615楼 得分:0
    恩,相当与 double x=fun((double)c); 参数是个临时对象,而临时对象不能被非const引用所引用...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • nirendao
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:44:4916楼 得分:0
    const引用可以引用临时变量的原理是什么?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zeroczh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:56:3017楼 得分:0
    C/C++ code
    #include <iostream> using namespace std; class base { public: base(int ival){val = ival;} int value(){return val;} private: int val; }; int calc(base &); int main() { cout<<calc(base(3));//请问对于这种情况呢,base(3)现在不是创建了一个临时对象吗?为什么可以非常引用 return 0; } int calc(base & obj) {return obj.value();}
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wwy_0918
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 17:07:5418楼 得分:0
    学习中,理解如下:
    引用不支持隐式类型转换,故不能将一个int类型传递给fun(double& a),但是如果参数类型为const double类型的的引用,即添加了类型约束const,而原来的变量不是const类型的,那么就会创建一个临时变量,相当于const double temp = (double)c; 函数中的a应该是temp。主要是关于函数参数为const类型的理解吧
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wwy_0918
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 17:13:4319楼 得分:0
    因为你的calc(base&)函数参数就是base类型的啊。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zeroczh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 17:39:3820楼 得分:0
    C/C++ code
    #include <iostream> using namespace std; class base { public: base(int ival =0):val(ival){} int value(){return val;} private: int val; }; class base2:public base {public: base2(int ival = 0):val(ival){} int value(){return val;} private: int val; }; int calc(base &); int main() { base2 objb2(3); base objb1; cout<<calc(objb2);//那么现在呢,objb2是base2类型,调用函数的是base的引用,应该要隐式的转换吧 return 0; } int calc(base &obj) {return obj.value();}
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • butabuta528
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 18:22:3321楼 得分:0
    #include <iostream>

    using namespace std;

    class base2
    {public:
    base2(int ival = 0):val(ival){}
    int value(){return val;}
    private:
    int val;
    };

    class base3
    {
    public:
        base3(int ival =0):val(ival){}
    base3(base2 par){ val = par.value();}
        int value(){return val;}
    private:
    int val;
    };

    int calc(base3 &obj)//error 
    {return 1;}

    int main()
    {
    base2 objb2(3);
    cout < <calc(objb2);
    return 0;
    }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • butabuta528
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 18:41:3222楼 得分:0
    回20楼
    在继承关系时,引用传递没有所谓的隐式类型转换
    回17楼
    类和基本类型概念不等同
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zeroczh
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 19:35:1323楼 得分:0
    明白了THANKS ^-^
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wangxipu
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 19:44:2524楼 得分:0
    thinking in C++
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • butabuta528
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 20:53:0325楼 得分:0
    引用 17 楼 zeroczh 的回复:
    C/C++ code#include <iostream>
    using namespace std;


    class base
    {
    public:
        base(int ival){val = ival;}
        int value(){return val;}
    private:
    int val;

    };

    int calc(base &);

    int main()
    {

    cout < <calc(base(3));//请问对于这种情况呢,base(3)现在不是创建了一个临时对象吗?为什么可以非常引用
    return 0;
    }


    int calc(base & obj)   
    {return obj.value();}


    到家了,终于可以好好写一番了。
    cout < < calc( base(3) );
    来说说为什么这里可以非常引用。

    C++对于类的构造函数而言,返回是一个左值,意味着我们甚至可以这样使用构造函数:
    base(3) = base(2);//是不是很神奇
    所以cout < < calc( base(3) );不会出错,因为base(3)是个左值,可以绑定到非常引用上。
    但是对于基本类型
    比如楼主说的
    int c = 2;
    double x=fun(c);
    这里fun使用fild和fstp产生double的对象tmp。
    而tmp是个右值,不能将此绑定到一个非常引用上去,所以编译不会通过。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved