个人主页:Jason_from_China-CSDN博客
所属栏目:C++系统性学习_Jason_from_China的博客-CSDN博客
所属栏目:C++知识点的补充_Jason_from_China的博客-CSDN博客
string模拟实现clear
模拟实现clear的目的是在流提取的时候我们清空之前的数据,然后重新输入使用的,不然就会导致
//clear的实现,和流提取综合使用实现void string::clear(){_str[0] = '\0';_size = 0;}
代码解释:
- 直接在下标为0的位置插入字符\0
- 更新_size
string模拟实现流插入(输出)
流插入和流提取我们直接重载为友元函数,在日期类的流插入和流提取里面什么表述的比较清楚,不明白为什么需要重载为友元函数的,可以看一下
日期类的实现(C++)_c++如何用whatday-CSDN博客
这里我们实现的目的就是可以直接打印出类
C++文档里面的参数
//重载为友元函数//流插入(输出)ostream& operator<<(ostream& os, const string& str){cout << "_str:" << str.c_str() << "/_size:" << str._size << "/_capacity:" << str._capacity << endl;//cout << "当前字符串:" << str.c_str() << endl;return os;}
注意事项:
- 这里是参数的接收
ostream&
是引用:
- 避免不必要的复制:当函数的参数是对象时,如果不使用引用,在函数调用时会创建对象的副本。对于像
ostream
这样的复杂流对象,复制它们的代价是很高的。ostream
类可能包含大量的内部状态信息,如缓冲区、格式标志等,复制这些信息会消耗大量的时间和内存。通过使用引用,函数直接操作原始的ostream
对象,避免了这种不必要的复制开销。- 保持对象的一致性:如果
ostream
对象被复制,那么在函数中对副本所做的任何操作(如设置格式标志、写入数据到缓冲区等)都不会影响到原始的ostream
对象。而使用引用可以确保函数对ostream
对象的操作反映在调用该函数的原始环境中。例如,在operator<<
函数中对输出格式的修改(如设置精度、宽度等)会在后续使用该ostream
对象的代码中生效。ostream& os,不使用
const
引用:
- 需要修改流状态:
ostream
对象在输出过程中可能会改变其内部状态,比如更新缓冲区指针、设置错误标志等。如果将参数声明为const
引用,就意味着在函数内部不能对ostream
对象进行任何修改,但实际上在输出操作中是需要修改这些状态信息的。例如,当向流中写入数据时,如果缓冲区已满,ostream
对象可能会自动刷新缓冲区,这涉及到对ostream
内部状态的修改,与const
的语义相冲突。因此,不能将ostream&
参数声明为const
引用。
string模拟实现流提取(输入)
//流提取(输入),提取不能使用cin和scanf进行封装,需要get或者getlineistream& operator>>(istream& is, string& str){str.clear();cout << "请输入字符串创建类:";//字符串输入不能使用cin,cin遇见空格和换行会导致直接停止读取,所以我们采取get()char ch;ch = is.get();//读取while (ch != '\n'){str += ch;//追加字符ch = is.get();//继续读取}return is;}
注意事项:
- 我们读取不能使用cin,因为cin读取的时候会遇见空格和换行都会停止读取,我们是需要读取空格的,所以是不能使用cin,所以我们需要到iostream库里面找找看看什么合适
- 我们需要创建一个字符,然后循环读取,这里的判断条件是遇见换行就会跳出循环,我们也可以自己设置判断条件,比如可以设置为遇见///
精讲合集: