2018-12-25 C++ 学习笔记

6 篇文章 0 订阅

一、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_typeiteratorString 类的专属类型,类以外的函数引用时应分别描述为 String::size_typeString::iterator


三、delete 和 delete[] 的区别

对于指向简单类型(intchar 等等)数组的指针,deletedelete[] 没有区别;

对于指向对象数组的类指针,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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值