注册 登录
编程论坛 C++教室

为什么没有输出任何值

hffjhhh 发布于 2021-04-15 18:10, 1633 次点击
以下这段代码:
程序代码:
#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{

改成这样之后。结果没有输出任何值。为什么会这样?
5 回复
#2
rjsp2021-04-16 08:59
也就是
程序代码:
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;
}
#3
hffjhhh2021-04-18 04:10
回复 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编辑过]

#4
rjsp2021-04-20 08:44
这时s.total<total。返回*this。这时返回的也是临时对象
*this 不是临时对象,就是这个类对象自身
#5
hffjhhh2021-04-20 12:39
以下是引用rjsp在2021-4-20 08:44:12的发言:

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

那为什么只输出46和77.7。而没有输出字符串skg
#6
rjsp2021-04-21 10:41
*this 不是临时对象,但你的
const Stock Stock::val(const Stock &s)const
返回的不是引用,而是拷贝构造了一个临时对象。
然后你又用
p=&p->val(stock1[1]);
取这个右值的地址。正常的编译器根本不可能让这代码编译通过。

那为什么只输出46和77.7。而没有输出字符串skg
“未定义行为”没有为什么
1