在引用或指针返回类型函数上输入

input on reference or on pointer return type functions

本文关键字:函数 输入 返回类型 指针 引用      更新时间:2023-10-16

我已经编写了以下代码,但我不知道它为什么有效。

#include<iostream>
#include<cstring>
using namespace std;
class temp_class
{
private:
    char id[20];
    char name[20];
    float price;
public:
    temp_class();
    char*getid();
    char*getname();
    float&getprice();
    void print()const;
};
temp_class::temp_class()
{
    strcpy(id,"unknown");
    strcpy(name,"unknown");
    price=0.0;
}
char*temp_class::getid(){return id;}
char*temp_class::getname(){return name;}
float&temp_class::getprice(){return price;}
void temp_class::print()const
{
    cout<<"ID : "<<id<<" / Name : "<<name<<" / Price : "<<price<<endl;
}
int main()
{
    int i=0;
    int n=0;
    cout<<"Enter Number of Items : ";
    cin>>n;
    temp_class*T=new temp_class[n];
    for(;i<n;i++)
    {
        cout<<"Enter ID,Name,and price for Item "<<i+1<<" : ";
        cin>>T[i].getid()>>T[i].getname()>>T[i].getprice();//the user will input on the 
    }                                                    //returned data members 
    for(i=0;i<n;i++)                                        //but why it worked ?
    { 
        T[i].print();
    }
    return 0;
}

所以我认为让它工作的原因是 float&getprice() 通过引用返回价格,因此对其所做的输入将对其内存位置产生影响,char*getid() 返回指向 id 的第一个存储单元的指针,默认情况下对数组的更改将生效,因为它是通过引用发送的(默认情况下),我认为 char*getname() 也是如此;

你的假设是正确的。 getprice() 返回对类成员的引用,然后调用者可以修改该引用。对于char*,有一个特殊的重载将它们视为字符串。由于仅按值返回指向实际字符串的指针,因此可以再次修改实际字符串。

如果你想避免这种行为,你可以将const关键字添加到你的返回值中