获得const结构和CIN的功能

Function receiving a const struct and cin commend

本文关键字:功能 CIN const 结构 获得      更新时间:2023-10-16
  1. 据我所知,当功能接收const时参数,函数无法更改它。所以,应该做什么当功能应更改参数时发生吗?(例如该函数包含" CIN"赞扬Const参数(。会是汇编错误吗?还是会运行但参数不要改变实践?
  2. 我尝试在下面的代码中进行一些测试。当我将void read_student (Student students[], int size)设置为void read_student (const Student students[], int size)时,我会收到以下内容错误消息(这些只是其中一些(。这会发生吗?因为" const"参数和" cin"的组合表彰?如果是,我应该如何理解这些消息?

| 19 |错误:"操作员>>'无匹配(操作数类型为'std :: istream {aka std :: basic_istream}'和'const char [20]'(|

| 19 |错误:类型非const引用的初始化无效 "布尔&'从类型的" bool" |

类型

| 19 |错误:从'const char*'到'short int'的无效转换 [-fpermissive] |

| 19 |错误:无法绑定rvalue'(简短int(((int((&(学生 ( (((sizetype((((((unsigned int(i( * 24U((( -> student :: name('至' int&'|

| 19 |错误:从'const char*'转换为'简短未签名 int'[-fpermissive] |

| 19 |错误:无法绑定rvalue'(简短的unsigned int(((int((&(学生 ( (((sizetype((((((unsigned int(i( * 24U((( -> student :: name('至' unsigned int& |

#include <iostream>
using namespace std;
const int max_students=3;
struct Student
{
    char name [20];
    float avg;
};

void read_student (const  Student students[], int size) //const Student VS Student
{
    for (int i=0; i<size; i++)
    {
        cout << "enter name and avg for student #" << i+1 << endl;
        cin >> students[i].name >> students[i].avg;
    }
}

void print_student (const Student students[], int size)
{
    for (int i=0; i<size; i++)
        cout << "name: " << students[i].name << "taverage: " << students[i].avg <<endl;
}


int main()
{
    Student students[max_students];
    read_student(students, max_students);
    cout << "ell students: n";
    print_student(students, max_students);

    return 0;
}

您会遇到汇编错误,因为操作员>>不适用于在文档中看到的常数变量。因此,由于将变量设置为常数和使用操作员>>的组合而发生了错误。删除一个或另一个解决问题

这是您可以尝试自己查看的示例代码。

void Foo(int const x) {
    std::cin >> x;    // doesn't compile because operator>> not defined for int const
}
void Foo2(int x) {
    std::cin >> x;    // Compiles properly
}

在您的情况下,函数构造函数应为 read_student(Student students[], int size),因为在函数中修改了 students[]

错误行error: no match for 'operator>>' (operand types are 'std::istream {aka std::basic_istream}' and 'const char [20]')指示此特定变量类型的无操作员>> Overloading存在,例如const char[]

我希望这能回答您的问题。

void print_student (Student *students, int size)
{
    for (int i=0; i<size; i++)
        cout << "name: " << students[i].name<<"taverage<<students[i].avg<<endl;
}

并称其为:

print_student (&students,  size);

看起来像作业...你去那里:

void read_student(Student students[], int size) //const Student VS Student
{
    for (int i = 0; i<size; i++)
    {
        cout << "enter name and avg for student #" << i + 1 << endl;
        cin >> students[i].name >> students[i].avg;
    }
}

提示很明显,//const Student VS Student,现在是一个常数,这意味着在创建它的值之后无法更改。它们是确保必须在与它们的交互时创建新容器的好方法,而不是与容器内的值相连。