【问题标题】:return struct value in C++在 C++ 中返回结构值
【发布时间】:2021-02-21 08:04:17
【问题描述】:

当我学习 C++ 中的 const 引用类型时, 我学会了返回引用类型在主函数中使用局部变量, 所以我测试了返回的正常结构类型如何在左值中工作。所以我预计这个来源不会编译, 但它编译得很好...... :( 所以我有两个问题

“是返回结构变量吗?为什么这段代码编译得很好?”

“如果返回的结构不是变量,为什么编译这段代码?,我假设返回值是右值..”

#include<iostream>
#include<cstring>
using namespace std;
struct travel_time
{
    int hour;
    int min;
};
travel_time sumTime(travel_time, travel_time);
int main(void)
{
    travel_time p1, p2,sum;
    cin >> p1.hour >> p1.min;
    cin >> p2.hour >> p2.min;
    sum=sumTime(p1, p2);
    cout << sum.hour << "hour " << sum.min<<"min";
    sumTime(p1, p2) = p1;   //********** why it works? **********
    return 0;
}
travel_time sumTime(travel_time t1, travel_time t2) 
{
    travel_time sum;
    sum.hour = t1.hour + t2.hour+(t1.min+t2.min)/60;
    sum.min = (t1.min + t2.min) % 60;

    return sum;
}

【问题讨论】:

  • 为什么return struct可以在lavalue中使用? :(
  • 即使那不是引用类型????
  • “变量”是什么意思?在你的问题“返回的结构变量?”
  • 这能回答你的问题吗? Function returning struct as LValue
  • @HanjoungLee 对,sumTime(t1, t2).hour = 0; 也将无法在 C++ 中编译。结构赋值编译,因为它转换为sumTime(p1, p2).operator=(p1);

标签: c++


【解决方案1】:

是返回结构体变量吗?为什么这段代码编译得很好?

这没有多大意义。

travel_time sum; 是一个变量。当您调用sumTime 时,您会返回此变量的副本,而该副本本身并不是变量。所以答案是否定的,调用函数的结果不是变量。

我感觉你真正想问的是调用函数的结果是否是左值 - 不是,结果是右值(更具体地说,prvalue)。

如果返回的结构不是变量,为什么编译这段代码?,我假设返回值是右值..

这又是没有意义的,除非我将“变量”替换为“左值”。

在 C++ 中,您可以分配给类类型的右值(但不能分配给私有类型,例如 int)。请注意,struct travel_time 是一个类,尽管使用了“struct”这个词。严格来说,C++ 中没有结构,只有类。

有一些方法可以防止为您的班级分配此类作业,但您没有这样做。

【讨论】:

  • 感谢您的明确答复!我认为我应该更多地研究 c++ 中的右值,特别是关注 c 和 c++ 之间的区别!
猜你喜欢
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多