CS144-Lab0 学习笔记

编程tip

  1. 在进行数学运算时,增加中间变量
    比如
bool Reader::is_finished() const
{
  return flag_closed && buf.size() <= 0;
}

改成

bool Reader::is_finished() const
{
  bool is_fully_poped = buf.size() <= 0;
  return flag_closed && is_fully_poped;
}

增加中间变量,用中间变量的变量名来代替代码注释

  1. 减少不必要的if语句
void Writer::push( string data )
{
  // if(data.size() + buf.size() > capacity_) {
  //   buf.append(data.substr(0, capacity_ - buf.size()));
  //   bytes_pushed_cnt += capacity_ - buf.size();
  // } else {
  //   buf.append(data);
  //   bytes_pushed_cnt += data.size();
  // }

  // 更简洁的实现
  std::string data_append = data.substr( 0, available_capacity() );
  buf.append( data_append );
  bytes_pushed_cnt += data_append.size();
}

CPP相关

explicit关键字

主要用于确保某个类的构造函数只能显式调用,不能被隐式转换。
通常建议在单参数构造函数上使用 explicit,以防止意外的类型转换。

使用场景

  1. 防止隐式类型转换
    当你有一个带参数的构造函数时,编译器可能会自动调用这个构造函数来进行隐式类型转换。使用 explicit 关键字可以防止这种情况发生。

    class MyClass {
    public:
        explicit MyClass(int x) {
            // 构造函数
        }
    };
    
    void func(MyClass obj) {
        // 函数实现
    }
    
    int main() {
        func(42);  // 错误:不能隐式转换 int 到 MyClass
        func(MyClass(42));  // 正确:显式构造 MyClass 对象
        return 0;
    }
    

    在上面的例子中,MyClass 的构造函数被标记为 explicit,因此不能通过隐式转换将 int 转换为 MyClass 对象。必须显式地调用构造函数。

  2. 防止不必要的隐式转换
    隐式转换有时会导致代码的可读性降低,甚至引发难以发现的错误。使用 explicit 可以避免这种情况。

总结

  • explicit 关键字用于防止构造函数或转换函数的隐式调用。
  • 它提高了代码的安全性和可读性,避免了不必要的隐式转换。
  • 通常建议在单参数构造函数上使用 explicit,以防止意外的类型转换。

protected 关键字

  1. 访问权限:被标记为 protected 的成员可以被该类的成员函数访问,也可以被该类的派生类(子类)访问,但不能被类的外部代码直接访问。

  2. 用途:通常用于希望在类的外部不直接访问某些成员,但又希望在继承时能够访问这些成员的场景。这种设计允许子类能够使用和修改父类的某些数据或方法,而不暴露给外部使用。

delete关键字

使用delete关键字显式禁止某些操作

  // Copy/move constructor/assignment operators
  // FileDescriptor can be moved, but cannot be copied implicitly (see duplicate())
  FileDescriptor( const FileDescriptor& other ) = delete;            // copy construction is forbidden
  FileDescriptor& operator=( const FileDescriptor& other ) = delete; // copy assignment is forbidden
  FileDescriptor( FileDescriptor&& other ) = default;                // move construction is allowed
  FileDescriptor& operator=( FileDescriptor&& other ) = default;     // move assignment is allowed
posted @   KBZ232  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示