Skip to content

Oop-PTA-1

C++基础

  1. OOP的概念包括:data hiding, message passing(一个对象可以和另一个对象交互), data binding

    不包括:platform independent

  2. 封装 encapsulation,继承 inheritance,多态 polymorphism

  3. Abstraction in oop:

    • e.g.: Hiding the implementation and showing only the features
    • principles: Use abstraction whenever possible to avoid duplication
    • compare to encapsulation: abstraction is hiding, encapsulation is binding
    • levels: physical level, logical level, view level

      Using higher degree of abstraction can be safer

  4. The use of this pointer 允许开放式递归,the use of pointers, pass by value and parameterized constructor不允许

  5. 相同的变量名不可以被使用两次:

    1
    2
    3
    4
    class Student{
        int a;
        public: float a;    //error!
    }
    
  6. Classes没有size一说

    如果我们不在程序中使用class,基本上oop所有的特性都被违背了

  7. Class is logical abstraction because it provides a logical structure for all of its objects.

    Object is real abstraction because it actually contains those features of class.

  8. Object can be viewed as abstraction of data and code. It uses data members and their functioning as data abstraction. Code abstraction as use of object of inbuilt class.

  9. 作用域操作符 (scope operator),用来表示命名空间 (namespace)

    Namespace用来把类、对象、函数分组

    用处可以是封装数据,但不是把程序组织成逻辑单元

    Namespace声明不总是全局作用域;不能嵌套定义

    Namespace有private、public等访问说明符

    声明:namespace C{ int i; }

    e.g.:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    #include <iostream>
    #include <string.h>
    using namespace std;
    namespace A{ int var = 10; }
    namespace B{ int cout = 5; }
    int main()
    {
        using namespace B;
        cout << A::var;
    }
    // error: reference to 'cout' is ambiguous
    //    cout << A::var;
    //       ^~~~
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    #include <string.h>
    using namespace std;
    namespace { int var = 10; }
    int main()
    {
        cout << var;
    }
    //print: 10
    

    如果有多个头文件,头文件中要声明相同的内容,如何避免编译器redefinition:在不同的命名空间中定义这两个函数

  10. IO class是通过数据流、序列化和文件系统提供输入输出的

  11. 成员函数重写 (override):派生类和基类中具有相同名称的成员函数

    展现了 polymorphism这一特性

  12. 内联成员函数:在调用处将定义展开

  13. 如果一个对象采用值传递,那么会隐式地创建该对象的拷贝

    地址传递,显式地传递对象的地址

    引用传递,隐式地传递对象的地址,在被调用者中的改变也会映射到调用者中

  14. 当一个对象作为函数返回值的时候,一个临时的object将会被自动创建,用来保存返回值

    但是在返回对象的同时,销毁临时对象,是存在安全隐患的,如果要消除,可以重载赋值运算符并定义拷贝构造函数

  15. 对象的引用:是保存对象的变量和方法的地址

    在赋值或传递中使用object reference意味着正在使用这个对象的拷贝

    如果一个reference variable被声明为 final,这意味着它不可能被重新赋值以引用新的对象

  16. const member function:把所有数据成员都视作常量并且不允许更改

    1
    2
    void fun() const {}
    const returnType functionName(parameters);
    
    静态函数能被静态和非静态对象调用,非静态函数只能被非静态对象调用,如果静态对象调用了非静态成员函数,则会发生编译时错误 (compile time error)

    静态成员函数不能调用非静态的成员函数

    构造函数永远不可能是静态的

    通过函数重载可以同时有静态和非静态的版本:当const中的返回值不同的时候,静态和非静态函数需要同时存在;静态函数就返回静态引用 (const referece)

  17. Functions which differ in const-ness are considered to have different signature.

  18. 在程序中,建议多用静态函数,但是任何情况下都不强制使用

  19. 默认参数 (default arguments):不强制传递,必须被声明为参数列表中的最后几个参数

    如果一个函数所有的参数都是默认参数,但是仍然接收了一些值,那么函数会优先使用传递进来的参数

    不可以是函数指针,不可以是函数引用,不可以是typedef类型

    默认参数的名称只会被查找、检查可访问性,以及在声明时被绑定

    默认参数是在声明期间被绑定,调用函数时被执行的

  20. Those are declared inside the function definition make all the arguments default

  21. 当且仅当在同一作用域中再次声明函数时,可以将非模板函数与默认实参一起添加到已经声明的函数中

    The non-template functions can be added with default arguments to already declared functions if and only if the function is declared again in the same scope

  22. 虚函数在重写时,不获取基类对默认参数的声明

    如果要求一个构造函数能创建带参数和不带参数的对象,使用所有参数都是默认参数的构造函数是一个可行的办法