未来教育C++二级题库,错题笔记。2021-02-08
重载运算符
① C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载;
② C++不能重载的运算符只有5个,即"."、".*"、"::"、"?:"、“sizeof”;
③重载不能改变运算符运算对象的个数;
④重载不能改变运算符的优先级和结合性;
⑤重载运算符的函数不能有默认的参数;
⑥重载的运算符必须和用户定义的自定义类型的对象一起使用,至少应有一个是类对象,即不允许参数全部是C++的标准类型。
关于运算符重载为友元函数有如下规定:
①一般情况下,单目运算符最好重载为类的成员函数,双目运算符则最好重载为类的友元函数;
②双目运算符"=、()、[]、->"不能重载为类的友元函数。
非成员函数重载用友元函数的形式实现,"–“运算符重载分为前置和后置两种重载方式。用友元函数来实现”–“运算符的重载时,前置”–"运算符的重载的一般格式为:friend operator – (ClassName & );后置++运算符的重载的一般格式为:friend operator–(ClassName &,int)。
重载运算符的函数不能有默认的参数
常对象
常对象只能调用它的常成员函数,而不能调用非const函数,常对象的成员函数不一定都是常成员函数,只需保证其数据成员是常数据成员即可。常成员函数只能引用本类中的数据成员,而不能修改它。
this指针
this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员时,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。另外,全局函数和静态函数都不能使用this指针。
虚函数
在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数。虚函数必须是基类的非静态成员函数,其访问权限可以是protected或public。如果一个类包含了纯虚函数,称此类为抽象类。
基类和派生类
派生类可以有多个直接基类,而派生类有三种继承方式,在私有继承中,派生类的成员并不能访问基类的成员。如果基类中定义了缺省构造函数或根本没有定义任何一个构造函数时,在派生类构造函数的定义中可以省略对基类构造函数的调用。
构造函数
在定义一个派生类的对象时,先调用基类的构造函数,然后再执行派生类的构造函数,对象释放时,先执行派生类的析构函数,再执行基类的析构函数。
函数模板
函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型代表,这个通用函数就是函数模板。函数模板可以设定默认参数,这样在调用模板函数时就可以省略实参,函数模板的实例就是一个函数的定义。
for 循环变量作用域
在C++标准制定之前,在 for 循环中声明的变量在循环外也可以访问。例如:
for (int n=O; n 〈MAX;++n)
{
//..do something
}
++n;//OK in pre-standard C++; illegal in lsO C++
然而,在ISO C++中,for 循环变量的作用域被限制为循环本身。
常量数据成员初始化
常量数据成员的初始化只能通过构造函数的成员初始化列表进行
class MyClass
{
int _i;
public:
const int NUM;
MyClass(int i=0) : NUM(0) //对NUM应用成员初始化列表
{
_i = i;
}
int GetValue() const { return _i; }
};
释放动态空间
释放两个指针成员所指向的动态空间。释放动态空间应使用delete语句,因为要释放两个指针,使用语句:delete []idcardno, name;实现。注意当释放多个指针时,中间用逗号隔开。
delete[] idcardno, name;
动态数组分配空间
指针name指向申请到的足够容纳字符串new_name的空间。使用strlen(new_name)得到字符串new_name的长度,但是这里要注意加1。
name = new char[strlen(new_name)+1]
派生类构造函数
利用参数表中前几个参数对基类Person进行初始化。派生类的构造函数要使用成员列表初始化法对基类初始化,因此为const chor dept,doable sal,;Person(id_card_no,P_name,is_male)
Person(id_card_no,p_name,is_male)
拷贝构造函数
主要考查考生对拷贝构造函数的掌握,拷贝构造函数的形参都为引用,同时为了不改变形参的值要加上const,因此得出语句MyClass(const MyClass & p)。
MyClass(const MyClass & p)
{
value=p.value;
cout << "Copy constructor called." << endl;
}
程序流程图
在数据流图中,用标有名字的箭头表示数据流。在程序流程图中,用标有名字的箭头表示控制流。
堆排序
堆排序算法的比较次数是 n l o g 2 n nlog_2n nlog2n ,快速排序、冒泡排序和直接插入排序都是n(n-1)/2。
E-R 图
E-R 图转换成关系模型数据是把图形分析出来的联系反映到数据库中,即设计出表,所以属于逻辑设计阶段。在E-R图中实体集用矩形,属性用椭圆,联系用菱形。
指针
先定义指针变量,然后给指针变量赋初值有三种情况:①用取地址运算符"&"将变量地址赋给指针变量,如p=&a;②将一个指针变量中的地址赋给另一个指针变量,如p=p1;③给指针变量赋空值0,如q=0,表示该指针变量不指向任何变量。而不能用一个常量给指针变量赋初值。
常对象
常对象只能调用它的常成员函数,而不能调用非const函数,常对象的成员函数不一定都是常成员函数,只需保证其数据成员是常数据成员即可。
静态成员函数
静态成员函数由于没有this指针,所以不能访问本类中的非静态成员。
静态数据成员
静态数据成员可以初始化,但只能在类体外进行初始化,其一般形式为:数据类型类名::静态数据成员名=初值。
需求分析
在需求分析阶段可以使用的工具有数据流图DFD图、数据字典DD、判定树与判定表
对象基本特点
对象有如下一些基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。
子程序调用
栈支持子程序调用。栈是一种只能在一端进行插入或删除的线性表,在主程序调用子函数时要首先保存主程序当前的状态,然后转去执行子程序,最终把子程序的执行结果返回到主程序中调用子程序的位置,继续向下执行,这种调用符合栈的特点。