cin如何将字符串读入一个字符串class的对象?
How does cin read strings into an object of string class?
我在网上阅读了一些文档,发现 istream
class 早在 string
class 被添加之前就已经是 C++
的一部分。所以 istream
设计识别基本的 C++
类型,例如 double
和 int
,但它不知道 string
类型。所以有istream
class方法处理double
和int
等基本类型,但是没有istream
class方法处理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 >> a
和std::cout << a
。
与上面显示的 Number
class 类似,std::string
class 也使用了运算符重载。特别是 std::string
overloads operator>>
and operator<<
,允许我们编写 std::cin >> str
和 std::cout << str
,就像您在示例中所做的那样。
因为 std::string
将 >>
和 <<
运算符重载为 return 类型 std::istream
和 std::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;
}
我在网上阅读了一些文档,发现 istream
class 早在 string
class 被添加之前就已经是 C++
的一部分。所以 istream
设计识别基本的 C++
类型,例如 double
和 int
,但它不知道 string
类型。所以有istream
class方法处理double
和int
等基本类型,但是没有istream
class方法处理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 >> a
和std::cout << a
。
与上面显示的 Number
class 类似,std::string
class 也使用了运算符重载。特别是 std::string
overloads operator>>
and operator<<
,允许我们编写 std::cin >> str
和 std::cout << str
,就像您在示例中所做的那样。
因为 std::string
将 >>
和 <<
运算符重载为 return 类型 std::istream
和 std::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;
}