istream& operator>>(istream& in, String &str) { in >> str.m_str; return in; }
时间: 2024-04-04 11:34:07 浏览: 144
这是一个C++中的重载输入运算符(>>)的实现,其中String是一个自定义的字符串类。
这个重载函数的作用是从输入流(istream)中读取一个字符串,然后将这个字符串赋值给一个String对象。它的参数包括一个输入流对象in和一个String对象str的引用。
在函数体内部,使用了输入流对象in的输入运算符(>>)来读取一个字符串,然后将这个字符串赋值给str对象的成员变量m_str。
最后,将输入流对象in返回,方便链式调用,如:
```
String str;
cin >> str >> str;
```
这段代码可以连续读取两个字符串并赋值给str对象。
相关问题
将此文件改为多文件#include<iostream> #include<string.h> using namespace std; class CSTRING { private: char* p; public: CSTRING() { int len = 0; p = new char[len + 1]; p[0] = '\0'; } CSTRING(const char* str) { int len = strlen(str); p = new char[len + 1]; strcpy(p, str); } CSTRING(const CSTRING& str) { int len = strlen(str.p); p = new char[len + 1]; strcpy(p, str.p); } CSTRING operator+=( CSTRING& s) { char* str = new char[strlen(p) + strlen(s.p) + 3]; str[0] = '\0'; strcat(str, p); strcat(str, "--"); strcat(str, s.p); delete[]p; p = str; return *this; } friend ostream& operator<<(ostream& out, CSTRING& str); friend istream& operator>>(istream& in, CSTRING& str); int operator>(const CSTRING& str); }; ostream& operator<<(ostream& out, CSTRING& str) { out << str.p; return out; } istream& operator>>(istream& in, CSTRING& str) { in >> str.p; return in; } int CSTRING:: operator>(const CSTRING& str) { if (strcmp(p, str.p)>0){ return 1; }else {return 0; } } int main() { int n, i, j; while (cin >> n) { CSTRING *c = new CSTRING[n + 2]; for (i = 0; i < n; i++) { cin >> c[i]; } for (i = 0; i < n - 1; i++) for (j = 0; j < n - i - 1; j++) if (c[j] > c[j + 1]) { c[n] = c[j]; c[j] = c[j + 1]; c[j + 1] = c[n]; } for (i = 0; i < n; i++) c[n + 1] += c[i]; cout << c[n + 1] << endl; delete[] c; } return 0; }
这里提供一个多文件的实现,将CSTRING类的定义和实现分别放在CSTRING.h和CSTRING.cpp文件中,主函数放在main.cpp文件中。
CSTRING.h文件内容如下:
```c++
#ifndef CSTRING_H
#define CSTRING_H
#include<iostream>
#include<string.h>
using namespace std;
class CSTRING {
private:
char* p;
public:
CSTRING();
CSTRING(const char* str);
CSTRING(const CSTRING& str);
~CSTRING();
CSTRING operator+=(CSTRING& s);
int operator>(const CSTRING& str);
friend ostream& operator<<(ostream& out, CSTRING& str);
friend istream& operator>>(istream& in, CSTRING& str);
};
#endif
```
CSTRING.cpp文件内容如下:
```c++
#include "CSTRING.h"
CSTRING::CSTRING() {
int len = 0;
p = new char[len + 1];
p[0] = '\0';
}
CSTRING::CSTRING(const char* str) {
int len = strlen(str);
p = new char[len + 1];
strcpy(p, str);
}
CSTRING::CSTRING(const CSTRING& str) {
int len = strlen(str.p);
p = new char[len + 1];
strcpy(p, str.p);
}
CSTRING::~CSTRING() {
delete[] p;
}
CSTRING CSTRING::operator+=(CSTRING& s) {
char* str = new char[strlen(p) + strlen(s.p) + 3];
str[0] = '\0';
strcat(str, p);
strcat(str, "--");
strcat(str, s.p);
delete[]p;
p = str;
return *this;
}
int CSTRING::operator>(const CSTRING& str) {
if (strcmp(p, str.p) > 0) {
return 1;
}
else {
return 0;
}
}
ostream& operator<<(ostream& out, CSTRING& str) {
out << str.p;
return out;
}
istream& operator>>(istream& in, CSTRING& str) {
in >> str.p;
return in;
}
```
main.cpp文件内容如下:
```c++
#include<iostream>
#include"CSTRING.h"
using namespace std;
int main() {
int n, i, j;
while (cin >> n)
{
CSTRING* c = new CSTRING[n + 2];
for (i = 0; i < n; i++)
{
cin >> c[i];
}
for (i = 0; i < n - 1; i++)
for (j = 0; j < n - i - 1; j++)
if (c[j] > c[j + 1])
{
c[n] = c[j];
c[j] = c[j + 1];
c[j + 1] = c[n];
}
for (i = 0; i < n; i++)
c[n + 1] += c[i];
cout << c[n + 1] << endl;
delete[] c;
}
return 0;
}
```
istream& operator>>(istream& in, Complex& c) { //返回类型为istream的引用的重载函数,参数为istream的引用的重载和complex的引用的重载 string str; //定义str in >> str; //将流对象的数据引入到str中 size_t pos = str.find("+", 0); //找到+的位置 运用string类的内置函数find size_t posn = str.find("i", 0); size_t poss = str.find("-", 0); if (pos == string::npos) { // 如果没找到i c.realPart = stod(str); c.imagePart = 0; } else if (poss != string::npos) { string real = str.substr(0, poss); c.realPart = stod(real); str.erase(0, poss + 1); c.imagePart = stod(str); } else if (pos != string::npos) { // 如果找到了+ string real = str.substr(0, pos); // 提取实部 运用的string内置函数substr提取了+之前的 c.realPart = stod(real); //实部数字类型的转换 str.erase(0, pos + 1); //删除实部以及+,str剩下的为虚部 c.imagePart = stod(str); } else { // 形如 bi 当没有+时 c.imagePart = stod(str); //虚部为str,实部为0 c.realPart = 0; } return in; 上述代码不能实现虚部为复数的情况
是的,这段代码只能实现虚部为实数的情况,不能处理虚部为复数的情况。如果输入的字符串中包含复数,则会将复数的实部和虚部分别转换为double类型,并存储到Complex对象的实部和虚部中。
要处理虚部为复数的情况,可以在第一个if语句中增加对字符串中是否包含"-"的判断。如果包含"-",则说明虚部为负数,需要将其截取出来并加上负号。如果仍然是一个复数,可以使用递归的方式将其转换为Complex对象。
下面是一个修改后的代码示例:
```
istream& operator>>(istream& in, Complex& c) {
string str;
in >> str;
size_t pos = str.find("+");
size_t posn = str.find("i");
size_t poss = str.find("-");
if (pos == string::npos) {
c.realPart = stod(str);
c.imagePart = 0;
} else if (poss != string::npos && poss < pos) {
// 虚部为负数
string real = str.substr(0, poss);
c.realPart = stod(real);
str.erase(0, poss + 1);
size_t posn2 = str.find("i");
string imag = str.substr(0, posn2);
c.imagePart = -stod(imag);
} else if (pos != string::npos) {
string real = str.substr(0, pos);
c.realPart = stod(real);
str.erase(0, pos + 1);
size_t posn2 = str.find("i");
string imag = str.substr(0, posn2);
c.imagePart = stod(imag);
if (poss != string::npos && poss > posn2) {
// 虚部为复数
string sub = str.substr(posn2 + 1, poss - posn2 - 1);
Complex comp;
istringstream(sub) >> comp;
c.imagePart += comp.realPart;
c.imagePart += comp.imagePart * Complex(0, 1).realPart;
}
} else {
c.imagePart = stod(str);
c.realPart = 0;
}
return in;
}
```
这段代码实现了对虚部为复数的情况的处理,可以将输入的字符串转换为Complex对象。需要注意的是,在处理虚部为复数的情况时,使用了递归的方式将其转换为Complex对象。
阅读全文