cin如何将字符串读入一个字符串class的对象?

How does cin read strings into an object of string class?

我在网上阅读了一些文档,发现 istream class 早在 string class 被添加之前就已经是 C++ 的一部分。所以 istream 设计识别基本的 C++ 类型,例如 doubleint,但它不知道 string 类型。所以有istreamclass方法处理doubleint等基本类型,但是没有istreamclass方法处理string 个对象。

我的问题是,如果没有 istream class 方法来处理 string 对象,为什么这个程序可以工作以及如何工作?

#include <iostream>

int main(void)
{
  std::string str;
  
  std::cin >> str;
  std::cout << str << std::endl;

  return 0;
}

由于运算符重载。

在您的情况下,包括 <iostream> 将包括 <string>std::basic_string 的专业化。 std::basic_string 定义了 non-member functions operator<< and operator>>

同样,您也可以为自己的自定义类型重载 operator<<operator>>

这可以通过使用 运算符重载 来实现。如下例所示,您可以创建自己的 class 并重载 operator>>operator<<.

#include <iostream>

class Number 
{  
    //overload operator<< so that we can use std::cout<<  
    friend std::ostream& operator<<(std::ostream &os, const Number& num);
    
    //overload operator>> so that we can use std::cin>>
    friend std::istream &operator>>(std::istream &is, Number &obj);

    int m_value = 0;
    
    public:
        Number(int value = 0);    
};

Number::Number(int value): m_value(value)
{ 
}

std::ostream& operator<<(std::ostream &os, const Number& num)
{
    os << num.m_value;
    return os;
}

std::istream &operator>>(std::istream &is, Number &obj)
{
    is >> obj.m_value;
    if (is)        // check that the inputs succeeded
    {
        ;//do something
    }
    else
    {
        obj = Number(); // input failed: give the object the default state
    
    }
    return is;
}

int main()
{
     Number a{ 10 };
     
     std::cout << a << std::endl; //this will print 10
     
     std::cin >> a; //this will take input from user 
    
    std::cout << a << std::endl; //this will print whatever number (m_value) the user entered above

    return 0;
}

通过重载operator>>operator<<,这允许我们在上面的程序中写std::cin >> astd::cout << a

与上面显示的 Number class 类似,std::string class 也使用了运算符重载。特别是 std::string overloads operator>> and operator<<,允许我们编写 std::cin >> strstd::cout << str,就像您在示例中所做的那样。

因为 std::string>><< 运算符重载为 return 类型 std::istreamstd::ostream

他们是如何重载它的,你可以看看这个link that 给出的。

您也可以创建自己的 class 和重载运算符。这是一个例子:

class MyClass
{
   int numberOne;
   double numberTwo;
public:
   friend std::ostream& operator<<(std::ostream &out, const MyClass& myClass);
   friend std::istream& operator>> (std::istream& in, MyClass& myClass);
};
// Since operator<< is a friend of the MyClass class, we can access MyClass's members directly.
std::ostream& operator<<(std::ostream &out, const MyClass& myClass)
{
    out << myClass.numberOne <<  ' ' << myClass.numberTwo;
    return os;
}
// Since operator>> is a friend of the MyClass class, we can access MyClass's members directly.
std::istream& operator>> (std::istream& in, MyClass& myClass)
{
    in >> myClass.numberOne;
    in >> myClass.numberTwo;

    return in;
}


int main()
{
    MyClass myClass;
    std::cin >> myClass;
    std::cout << myClass;
}