如何将字符串读入string类的对象?



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

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

#include <iostream>
int main(void)
{
std::string str;

std::cin >> str;
std::cout << str << std::endl;
return 0;
}

可以使用操作符重载. 如下面的例子所示,您可以创建自己的类并重载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类类似,std::string类也使用操作符重载。特别是,std::string重载operator>>operator<<,允许我们编写std::cin >> strstd::cout << str,就像您在示例中所做的那样。

因为std::string重载了>><<运算符,返回类型为std::istreamstd::ostream

他们如何重载它,你可以看看Mat给出的这个链接。

也可以创建自己的类和重载操作符。下面是一个例子:

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;
}

由于操作符重载。

在您的示例中,包括<iostream>将包括<string>,它是std::basic_string的专门化。std::basic_string定义了非成员函数operator<<operator>>

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

相关内容

  • 没有找到相关文章

最新更新