- C++ I/O流
所谓流,是指数据的有向流动,即数据从一个设备流向另一个设备——从源设备到目标设备的字节序列 流实际上是一种对象,它在使用前被建立,使用后被删除 数据的输入/输出操作就是从流中提取数据或者向流中添加数据 通常把从流中提取数据的操作称为析取,即读操作;向流中添加数据的操作称为插入操作,即写操作 C++主要的流类简介 ios:提供对流状态进行设置的主要功能。如文件数据的格式码设置与取消,关联文件缓冲区借以实现数据读写等; 是所有流类的基类。 streambuf:定义了对缓冲区的通用操作,如设置缓冲区,从缓冲区中读取数据,或向缓冲区写入数据等操作; 主要作为其他类的支持。 filebuf:定义了文件读、写、打开、关闭等常用操作; 使用文件来保存缓冲区中的字符序列。
- 类
公有(public)成员:可以从结构(类)的外部访问; 私有(private)成员:仅供结构(类)的内部(自身成员函数)访问; 保护(protected)成员:供结构(类)的内部及后代访问 “struct结构体”中,成员的默认访问权限是:公有(public)的 面向对象“class类”中,成员的默认访问权限是:私有(private)的
-
对象赋值的语法格式: 对象名 1 = 对象名 2
-
构造函数、析构函数
构造函数(constructor): 是与类同名的特殊成员函数,主要用来初始化对象的数据成员 自动完成数据成员初始化,减少出错几率 构造函数与类同名:类名( ) 构造函数没有(无)返回类型 构造函数可以被重载(无参+有参) 构造函数由系统自动调用,不允许程序员显式调用。 析构函数(destructor): 是一个函数名与类名只差一个字符“~”,即在类名前面添加字符“~”的特殊成员函数,其作用与构造函数相反,主要用于在对象生存期结束时,完成对象的清理工作(回收分配给对象的内存空间) 用于对象生命期结束时,回收对象(分配的内存空间) 析构函数名为:~类名( ) 析构函数没有(无)返回类型 析构函数没有(无)参数,不能被重载:每个类仅有一个析构函数 析构函数由系统自动调用,不允许程序员显式调用。
- 构造函数、析构函数的顺序
若有多个对象同时结束生存期,C++将按照与调用构造函数相反的次序调用析构函数 每个类都应该有一个析构函数,如果没有显式定义析构函数。C++将产生一个最小化的默认析构函数 构造函数和析构函数都可以是inline内联函数 在通常情况下,析构函数与构造函数都应该被设置为类的公有成员,虽然它们都只能被系统自动调用的,但这些调用都是在类的外部进行的
- 构造函数种类
- 每个类必须有构造函数,如果一个类没有定义任何构造函数,在需要时编译器将会为它生成一个默认构造函数
- 使用系统提供的默认无参构造函数‘创建对象’
如果创建的是全局对象或静态对象,则对象的所有数据成员的值被初始化为0 如果创建的是局部对象,则不进行对象数据成员的初始化
- 拷贝构造函数
X::X(const X& other,...){ …… } 若有多个参数,第一参数必须是自身类类型的引用,其余参数必须有默认值 数据成员以“按位拷贝(bit-by-bit)”的方式实现复制 因此,当一个类有“指针类型的数据成员”时,默认拷贝构造函数常会产生指针悬挂问题
- 初始化参数列表
“初始化参数列表” 的形式如下: 构造函数名(参数列表): 成员1(初始值), 成员2(初始值),…{ …… } 初始化参数列表中,成员初始化次序与它们在类中的声明次序相同,与初始化参数列表中的次序无关 数据成员的执行次序为:类内初始化->初始化参数列表->构造函数体 对象成员先于对象构造 对象成员的构造次序取决于其在类中的声明顺序,与它们在初始化参数列表中的顺序无关
- 委托构造函数:一个构造函数使用它所在类的其他构造函数执行自己的初始化功能,或者说一个构造函数把自己的一些或全部职责委托给其他构造函数;委托构造函数只能在初始化列表中调用它要委托的构造函数,且初始化列表中不允许再有其他成员初始化列表,但委托构造函数中可以有代码
- 常量数据成员的初始化可以通过构造函数初始化参数列表
- 静态类成员变量
静态数据成员的常常在类外定义,有2方式: 使用默认值的方式: 类型 类名::静态成员名; 指定初始值的方式:类型 类名::静态成员名=初始值 在类外定义静态数据成员时,不能加上static限定词 若定义时没有指定初值,系统默认初始值为0 类没有任何对象时,其就已经存在 生命周期与程序相同 被类的所有成员所共享 类名::静态成员名 对象名.静态成员名
- 成员函数定义
(1)在类声明中定义(内置定义 内置函数) 类内定义的函数成员默认为内联函数 (2)在类声明之外定义(外置定义 外置函数) 类外定义的函数成员要成为内联函数, 需要手动声明
- 常量函数成员
返回类型 函数名(参数列表) const; 只有类的函数成员才能定义为常量函数成员, 普通函数不能定义为常量函数。
- 对比 常量函数
double distance(const int& p1); //常量参数 int fun(int t) const; //常量函数成员 前者可出现在任何函数中,而后者只适用于类函数成员; 前者限制“函数对参数的修改”,而后者限制“类函数成员对类数据成员的修改”
- 静态函数成员
只能访问属于类的静态成员(包括静态数据成员和静态函数成员) 不能访问非静态成员(包括非静态的数据成员和函数成员)
- 类成员权限
使用接口间接访问: 需要频繁的参数传递、参数类型检查及函数调用。 (1)操作麻烦;(2)占用较多的存储空间和时间,降低程序的运行效率; (3)增加程序员的代码量
- 使普通函数dist2可“直接”访问point类定义的成员x, y->友元函数
class X{ …… friend T f(…); //声明f(…)为X类的友元函数 …… }; …… T f(…) { …… } //友元函数不是类成员函数, 定义时不能用“X::f”限定 友元函数是一种特殊的函数,可以直接访问类的所有成员(包括public、protected、private成员)。因此,编程更简洁、程序运行效率更高;但友元函数破坏了类的封装性和信息隐藏 友元函数并非类的函数成员,所以不受public、private、 protected的限定,无论将它放在public区、protected区、还是private区,都是完全相同的 关键字friend用于声明友元,它只能出现在类的声明中 友元不具逆向性(双向的)和传递性。即若A是B的友元,并不表示B是A的友元(除非特别声明);若A是B的友元,B是C的友元,也不能代表A是C的友元 ① 友元函数成员可以直接访问另一个类的所有成员(包括public、protected、private成员)。 ② 不是友元的函数成员只能通过公有函数成员访问其他类的私有和保护成员。 class A{ …… T f(…) { …… } //定义A的函数成员f(…) }; class B{…… //声明类B friend T A::f(…); //声明A类的f(…)为B类的友元函数, 必须能用“A::”限定 }
- 友元类
在类域内的“类声明”之前 加上关键字friend,就是将该类指定为当前类的友元类 一个类(友元类)可以是另一个类的友元,友元类的所有函数成员都是另一个类的友元函数,能够直接访问另一个类的所有成员(包括public、private和protected) 友元类并非类的“成员”,所以不受public、private、 protected的限定,无论将它放在public区、protected区、还是private区,都是完全相同的 关键字friend用于声明友元,它只能出现在类的声明中 友元类不是双向的(逆向性)和传递性 class A{ //声明类A …… friend class B; //声明类B是类A的友元类 …… }; class B{ //声明类B …… }
- this指针
① 是用于标识一个对象自引用的隐式指针,代表对象自身的地址,并且不允许修改; ② 是函数成员中,指向调用该函数的对象自身的隐式指针; 在编译类函数成员时,C++编译器会自动将this指针添加到函数成员的参数类表中 在对象调用类函数成员时,调用对象会把自己的地址 通过this指针传递给函数成员 在类函数成员中,可以通过this指针返回对象的地址或引用 引用是一个地址,允许函数返回引用就意味着函数调用可以被再次赋值,即允许函数调用出现在赋值语句的左边 在类X的非const函数成员里,this的类型就是X *。在类的const函数成员里,this被设置成const X *类型,不能通过它修改对象的数据成员值 静态函数成员没有this指针,因为在静态函数成员中不能访问对象的非静态数据成员
- 函数参数传递
函数参数传递有3种方式: 值传递(传递的是:实参的一个拷贝) 地址传递(传递的是:实参的一个拷贝(实参的值为地址) 引用传递(传递的是:实参的引用[别名])
- 移动函数
对象移动:把一个在内存区域中的内容转移给另一个对象 主要解决临时对象复制时的系统开销,提高效率 对象移动相当于把某对象拥有的内存资源“转让”给另一对象使用,其实质是把对象的内存资源(即右值)绑定到要转移给的对象
- 类域:
类域:是指类声明时的一对花括号所括起来的范围,形式如下: class X{ //类域开始 …… }; //类域结束 类域范围内(简称‘类内’)的成员可以互相访问,不受成员访问控制权限的限定; 类域范围外(简称‘类外’)的函数则只能访问类的公有public成员(数据+函数)。
- 对象的生存周期
静态生存期:是指对象具有与程序运行期相同的生存期。 这类对象一旦被建立后,它将一直存在,直到程序运行结束时才被销毁。 动态生存期:是指局部对象的生存期。 局部对象具有块作用域,它的生存期是从它的定义位置开始,遇到离它最近的“}”就结束了 全局对象和静态对象具有静态生存期
C++的答辩复习记录-03
于 2023-06-04 19:25:30 首次发布