| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1746 人关注过本帖
标题:为什么没有输出任何值
只看楼主 加入收藏
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
结帖率:90.38%
收藏
已结贴  问题点数:20 回复次数:5 
为什么没有输出任何值
以下这段代码:
程序代码:
#include<iostream>
#include<string>
class Stock{
private:
    std::string co;
    double gat;
    int total;
public:
    Stock(const std::string s,int i=0,double j=0.0);
    const Stock &val(const Stock &s)const;
    void show()const;
};
void Stock::show()const{
    std::cout<<co<<std::endl<<total<<std::endl<<gat;
}
Stock::Stock(const std::string s,int i,double j){
    co=s;
    total=i;
    gat=j;
}
const Stock &Stock::val(const Stock &s)const{
    if(s.total>total)
        return s;
        else
        return *this;
}

int main(){
    Stock stock1[4]={
        Stock("skg",4,7.7),
        Stock("skgjg",5,3.9),
        Stock("irgnj",33,5.7),
        Stock("eiur",4,5.7)
    };
    const Stock *p=&stock1[0];
    for(int i=1;i<4;i++){
        p=&p->val(stock1[1]);
    }
    p->show();
    return 0;
}

输出结果为:
skgjg
5
3.9

当我将其中这段代码:
const Stock &val(const Stock &s)const;

改为:
const Stock &val(const Stock s)const;

并且将这段代码:
const Stock &Stock::val(const Stock &s)const{

改为:
const Stock &Stock::val(const Stock s)const{

改成这样之后。结果没有输出任何值。为什么会这样?
搜索更多相关主题的帖子: int total std 输出 const 
2021-04-15 18:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
也就是
程序代码:
const Stock &Stock::val(const Stock s)const{
    if(s.total>total)
        return s;
    else
        return *this;
}
这个呗?! 那 return s; 返回的是一个临时对象的引用,这个函数调用结束后它就不存在了。
这是一个“未定义行为”。

此外,要按标准写代码
程序代码:
#include <iostream>
#include <string>
#include <algorithm>

class Stock
{
public:
    explicit Stock( const std::string co, int total=0, double gat=0.0 );
    bool operator<( const Stock& rhs ) const;
    friend std::ostream& operator<<( std::ostream& os, const Stock& obj );
private:
    std::string co_;
    double gat_;
    int total_;
};

Stock::Stock( const std::string co, int total, double gat ) : co_(co), total_(total), gat_(gat)
{
}
bool Stock::operator<( const Stock& rhs ) const
{
    return total_ < rhs.total_;
}
std::ostream& operator<<( std::ostream& os, const Stock& obj )
{
    return os << obj.co_ << '\n' << obj.total_ << '\n' << obj.gat_;
}

int main( void )
{
    Stock s[4] = {
        Stock("skg",    4, 7.7),
        Stock("skgjg",  5, 3.9),
        Stock("irgnj", 33, 5.7),
        Stock("eiur",   4, 5.7)
    };

    auto itor = std::max_element( std::begin(s), std::end(s) );
    std::cout << *itor << std::endl;
}
2021-04-16 08:59
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
收藏
得分:0 
回复 2楼 rjsp
如果改为如下:
程序代码:
#include<iostream>
#include<string>
class Stock{
private:
    std::string co;
    double gat;
    int total;
public:
    Stock(const std::string s,int i=44,double j=55);
    const Stock val(const Stock &s)const;
    void show()const; 
};
void Stock::show()const{
    std::cout<<co<<std::endl<<total<<std::endl<<gat;
}
Stock::Stock(const std::string s,int i,double j){
    co=s;
    total=i;
    gat=j;
}
const Stock Stock::val(const Stock &s)const{
    if(s.total>total)
        return s;
        else
        return *this;
}

int main(){
    Stock stock1[4]={
        Stock("skg",46,77.7),
        Stock("skgjg",5,3.9),
        Stock("irgnj",33,5.7),
        Stock("eiur",4,5.7)
    };
    const Stock *p=&stock1[0];
    for(int i=1;i<4;i++){
        p=&p->val(stock1[1]);
    }
    p->show();
    return 0;
}

这时s.total<total。返回*this。这时返回的也是临时对象,函数调用结束后就不存在了,应该没有输出任何值才对,为什么仍然有输出值?输出结果为:
图片附件: 游客没有浏览图片的权限,请 登录注册

而且字符串没了,只有两个值。为什么会这样?


[此贴子已经被作者于2021-4-18 04:13编辑过]

2021-04-18 04:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
这时s.total<total。返回*this。这时返回的也是临时对象
*this 不是临时对象,就是这个类对象自身
2021-04-20 08:44
hffjhhh
Rank: 1
等 级:新手上路
帖 子:127
专家分:7
注 册:2019-4-10
收藏
得分:0 
以下是引用rjsp在2021-4-20 08:44:12的发言:

*this 不是临时对象,就是这个类对象自身

那为什么只输出46和77.7。而没有输出字符串skg
2021-04-20 12:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
*this 不是临时对象,但你的
const Stock Stock::val(const Stock &s)const
返回的不是引用,而是拷贝构造了一个临时对象。
然后你又用
p=&p->val(stock1[1]);
取这个右值的地址。正常的编译器根本不可能让这代码编译通过。

那为什么只输出46和77.7。而没有输出字符串skg
“未定义行为”没有为什么
2021-04-21 10:41
快速回复:为什么没有输出任何值
数据加载中...
 
   



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

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