文章目录
一、iostream 新知
(一) istream 不忽略任何内容地读入单个字符
istream is;
char c = is.get();
(二) 重载 << 和 >>
为自定义类重载 <<
和 >>
的关键是对该自定义类的成员变量进行输入输出流操作。
class String {
public:
...
friend std::ostream& operator<<(std::ostream& os, const String& content);
friend std::istream& operator>>(std::istream& is, String& target);
private:
size_type length_;
char* string_;
static const size_type kInputBufferSize = 1024;
};
std::ostream& operator<<(std::ostream& os, const String& content);
std::istream& operator>>(std::istream& is, String& target);
std::ostream&
operator<<(std::ostream& os, const String& content) {
if (content.length_ != 0) {
os << content.string_; // 在重载函数内部对可进行流操作的成员变量进行流操作
}
return os;
}
std::istream&
operator>>(std::istream& is, String& target) {
delete[] target.string_;
target.length_ = 0;
char buffer[String::kInputBufferSize] = { 0 };
char* buffer_iterator = buffer;
//建立缓冲区,往缓冲区里读入单个字符
while (buffer_iterator != buffer + String::kInputBufferSize) {
char c = is.get();
if (isspace(c)) {
break;
}
*buffer_iterator = c;
++target.length_;
++buffer_iterator;
}
//将缓冲区内容复制到成员指针变量所指向的内存区域中
target.string_ = new char[target.length_ + 1];
strncpy(target.string_, buffer, target.length_);
target.string_[target.length_] = '\0';
}
二、定义类的专属类型:using
class String {
public:
using size_type = size_t;
using iterator = char*;
iterator Begin(void);
iterator End(void);
...
size_type GetLength(void) const;
private:
size_type length_;
char* string_;
static const size_type kInputBufferSize = 1024;
static const size_type no_position_ = -1;
};
在以上程序中,size_type
和 iterator
为 String
类的专属类型,类以外的函数引用时应分别描述为 String::size_type
和 String::iterator
。
三、delete 和 delete[] 的区别
对于指向简单类型(int
,char
等等)数组的指针,delete
和 delete[]
没有区别;
对于指向对象数组的类指针,delete
只会释放指针所指数组中的第一个对象元素,而 delete[]
会释放指针所指数组中的所有对象元素。
四、封装格式化输出
#include <cstdio>
#include <cstdarg>
void
Write(const char* formated, ...) {
va_list args;
va_start(args, formated);
vfprintf(log_, formated, args);
va_end(args);
}
int
main(int argc, char const* argv[]) {
Write("Name: %s\tNumber: %d", "Hubbard Huang", 2);
return 0;
}