Oop-PTA-1
C++基础
-
OOP的概念包括:data hiding, message passing(一个对象可以和另一个对象交互), data binding
不包括:platform independent
-
封装 encapsulation,继承 inheritance,多态 polymorphism
-
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
-
The use of this pointer 允许开放式递归,the use of pointers, pass by value and parameterized constructor不允许
-
相同的变量名不可以被使用两次:
1 2 3 4
class Student{ int a; public: float a; //error! }
-
Classes没有size一说
如果我们不在程序中使用class,基本上oop所有的特性都被违背了
-
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.
-
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.
-
作用域操作符 (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:在不同的命名空间中定义这两个函数
-
IO class是通过数据流、序列化和文件系统提供输入输出的
-
成员函数重写 (override):派生类和基类中具有相同名称的成员函数
展现了
polymorphism
这一特性 -
内联成员函数:在调用处将定义展开
-
如果一个对象采用值传递,那么会隐式地创建该对象的拷贝
地址传递,显式地传递对象的地址
引用传递,隐式地传递对象的地址,在被调用者中的改变也会映射到调用者中
-
当一个对象作为函数返回值的时候,一个临时的object将会被自动创建,用来保存返回值
但是在返回对象的同时,销毁临时对象,是存在安全隐患的,如果要消除,可以重载赋值运算符并定义拷贝构造函数
-
对象的引用:是保存对象的变量和方法的地址
在赋值或传递中使用object reference意味着正在使用这个对象的拷贝
如果一个reference variable被声明为
final
,这意味着它不可能被重新赋值以引用新的对象 -
const member function:把所有数据成员都视作常量并且不允许更改
静态函数能被静态和非静态对象调用,非静态函数只能被非静态对象调用,如果静态对象调用了非静态成员函数,则会发生编译时错误 (compile time error)1 2
void fun() const {} const returnType functionName(parameters);
静态成员函数不能调用非静态的成员函数
构造函数永远不可能是静态的
通过函数重载可以同时有静态和非静态的版本:当const中的返回值不同的时候,静态和非静态函数需要同时存在;静态函数就返回静态引用 (const referece)
-
Functions which differ in const-ness are considered to have different signature.
-
在程序中,建议多用静态函数,但是任何情况下都不强制使用
-
默认参数 (default arguments):不强制传递,必须被声明为参数列表中的最后几个参数
如果一个函数所有的参数都是默认参数,但是仍然接收了一些值,那么函数会优先使用传递进来的参数
不可以是函数指针,不可以是函数引用,不可以是typedef类型
默认参数的名称只会被查找、检查可访问性,以及在声明时被绑定
默认参数是在声明期间被绑定,调用函数时被执行的
-
Those are declared inside the function definition make all the arguments default
-
当且仅当在同一作用域中再次声明函数时,可以将非模板函数与默认实参一起添加到已经声明的函数中
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
-
虚函数在重写时,不获取基类对默认参数的声明
如果要求一个构造函数能创建带参数和不带参数的对象,使用所有参数都是默认参数的构造函数是一个可行的办法