Simple Classes / Custom Types

Customs Types是个什么东西,不好理解,大概可以看做是一个simple classes,一个类。

Type Categories (simplified)

  • 基础类型 void,bool,char,int,double
  • 简单聚合 - struct(应该指的是c语言中那种struct聚合)
  • 自定义类型 -类

Why Custom Types?

翻译一下,这个问题就是为什么要引入c++ 类和对象的概念,而不用c里的简单聚合类型?这个问题好大,不好回答,关乎c++的设计思路。有几个keywords。

  • Correctness Guarantees 保证正确性
    1.invariants = behavior and/or data properties that never change
    ??不变的行为和数据属性,好难理解...
    2.avoid data corruption by controlling/restricting access to data members
    通过对数据成员访问的限制防止数据冲突
  • Reusable Abstractions 可重用的抽象模型
    1.通过易用的接口隐藏低层次的实现细节
    2.接口稳定,不收低层次的实现细节的影响
    3.可以对常用设施做一个可重用的抽象
  • Resource Management 易于资源管理 RAII
    1.当对象constructed时获取对应资源
    2.当对象destroyed时释放相应资源

Restricted Member Access 有限制的成员访问

  • Member Functions 成员函数
    1.私有成员只能通过成员函数访问
    2.struct与class主要区别在于默认可见性
  • public vs. private Visibility 可见性
  • const Member Functions 常成员函数
    1.const对象只能调用const-qualified的成员函数
    2.使用const(reference)作为参数的函数不能在内部对其修改
    3.

    // write access to a 'node'
     node&       **at**(int x) { … }
     // read-only access to a 'node'
     node const& **at**(int x) const { … }
  • Member Declaration vs. Definition 成员声明和定义
    1.复杂成员函数的定义通常放在类之外(并放在单独的源文件中)。
    2.但是,小型成员函数(如接口适配器函数,getter(如count))应内联实现,即,直接在类主体中实现最大性能
  • Operator Member Functions 运算符成员函数
    1.

    operator [] (int i) { … } 

    Initialization 初始化

    其他的点不说了,说几个重要的点
    - 显式构造函数↔隐式转换
    image.png

Design, Conventions & Style 设计约定

...

Example Implementations 示例实现

...

Pointers

Why Pointer 为什么使用指针

1.观察对象(而且想在运行时改变指向,不能用引用)
2.想要获取一个动态生命周期的对象(声明周期不与某个变量或者某个scope绑定)
3.构造 Node-Based 的数据结构(Lists,Tree.Graphs)

Raw指针与Smart指针

  • 原始指针
    1.本质上是一个(unsigned) integer ,存储一块内存地址
    2.多个raw P可指向一个addrrss/object
  • std::unique_ptr<T>
    1.指向objects on the heap
    2.一个up一个对象
    3.up和对象声明周期绑定
    -std::shared_pointer<T>, std::weak_pointer<T>
    1.指向objects on the heap
    2.可以有多个sp/wp指向一个object
    3.只要有一个share_ptr指向object。object就活着

    指针操作符

  • & 取地址符 (用于类型定义时,定义一个引用)
  • * 解引用符 (用于类型定义时,定义一个指针)
  • -> Member Access 成员访问符

    const与指针

    建议采用east const写法,从右往左读语义清晰
    image.png

this pointer

  • this 返回对象本身的地址
  • this-> 可用于访问成员
  • *this 访问对象本身

    能用引用的地方尽量避免指针

    Destructors

    Big 6 构造/析构/拷贝构造/拷贝赋值/移动构造/移动赋值

  • 由编译器自动生成,在很多情况下不需要用户定义
    image.png

    RAII

    C++使用值语义

  • =(assignment)指向对象本身,并不仅仅是指针或引用
  • 这是几乎所有编程语言中基本类型(int,double等)的默认行为,也是C ++中用户定义类型的默认行为
  • 因此都是深拷贝,深赋值,深度所有权,深度可比较(operator ==,!=,<,<=...)

Exceptions 异常

f(){
    ...
    throw std::invalid_argument("...");
}

try{
    f();
}
catch(std::invalid_argument& e){
    cerr << ...
}

Noexcept

使用noexcept 保证绝不允许抛出异常,如果抛出了,程序直接终止


ysysys
10 声望1 粉丝