1. 子类重新定义父类虚函数的方法叫做继承,不是重载。

 

2. 词法分析器用于识别:单词。

 

词法分析是编译的第一阶段。词法分析器的主要任务是读入源程序的输入字符、将他们组成词素( 源程序中的一个字符序列,它和某个词法单元的模式匹配,并被词法分析器识别为该词法单元的一个实例 ),生成并输出一个词法单元序列,每个词法单元对应一个词素。这个词法单元序列被输出到语法分析器进行语法分析。

 

词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。在谈论词法分析时,使用术语“词法记号”(简称记号)、“模式”和“词法单元”表示特定的含义。

在分析时,一是把词法分析器当成语法分析的一部分,另一种是把词法分析器当成编译程序的独立部分。在前一种情况下,词法分析器不断地被语法分析器调用,每调用一次词法分析器将从源程序的字符序列拼出一个单词,并将其Token值返回给语法分析器。后一种情况则不同,词法分析器不是被语法分析器不断地调用,而是一次扫描全部单词完成编译器的独立一遍任务。

 

3. 已经定义过的全局变量,假如用引用头文件的方式引用,假如有两个cpp以上引用这个头文件就会出现重复定义,用extern引用只是声明,不会分配内存,不会重复定义,所以用extern。

 

4.指针i++和++i是类似的。因为i++在计算时,会占用更多的内存和时间,所以++i更好。

对于老旧的编译器++i效率好,对于好的编译器i++被优化了,表示该用哪个用哪个。

 

5.关于模板类:

(1)可用来创建动态增长和减小的数据结构;

(2)它是类型无关的,因此具有很高的可复用性;

(3)它在编译时而不是运行时检查数据类型,保证了类型安全;

(4)它是平台无关的,可移植性;

(5)可用于基本数据类型;

 

6. 不能重载的总共五个: (1) "."(类成员访问运算符) (2)" .*"(类成员指针访问运算符) (3) "::"(域运算符) (4)"siezof"(长度运算符) (5) " ?:"(条件运算符)

 

不能够重载的有:

. :: .* ?:

new 、delete、 sizeof、 typeid 、static_cast const_cast、 dynamic_cast 、reinterpret_cast

 

7.分析下述程序:

#include<stdio.h>
int main()
{   unsigned int a=6;
    int b=-20;
    (a+b>6)?printf(">6"):printf("<=6");
    return 0;
}

打印出:>6;当一个算术表达式中既有无符号数又有带符号数时,带符号数就会自动被提升为无符号数。

 

这里将负数-20提升为无符号数的过程,等价于直接给无符号数赋一个负值,其结果等于这个负数加上无符号数的模,即:-20+2^32=4294967276。

故 a+b = 6 + 4294967276 =4294967282 > 6

 

8. 可见性就是在在什么地方可以调用,能调用的地方就是可见,而存在性,就是在什么地方什么时候初始化,然后使用完后在什么地方什么时候释放,存在性一般是在运行时的生命周期内起作用的,这个题目里除了static其他都是在函数结束时自动释放了。

 

一、变量的作用域与存储类型

一个C程序(*.EXE)由若干个C文件(*.C)组成,一个(*.C)文件由若干个C函数组成。函数内、外均可(根据需要)定义或声明变量。

【按作用域划分】内部变量、外部变量

内部变量:在函数内定义变量称为内部变量(局部);

外部变量:在函数外定义变量称为外部变量(全局);

二者区别:定义出现的位置。

 

【按存储类型划分】auto、static/register(动态、静态/寄存器变量)

变量定义一般格式:[存储类型]数据类型变量表

auto:动态:([存储类型]缺省时,系统默认为动态;)

位置:动态区

特点:程序运行时动态分配,每次调用时都重新赋初值,调用不赋初值时,其值不确定

 

static:静态:

位置:静态区

特点:程序编译时静态分配,每次调用时不再重新赋初值,保留最后一次调用的值。

 

二者区别:存储位置不同。

register:寄存器:

位置:在CPU内;

特点:速度快;

补充说明:一般不用认为进行存储类型声明,系统编译时,根据需要自动声明register类型)

 

二、Static:用于变量和函数时的不同意义

1. Static:用于变量时,共性是:静态存储

(1)用于外部变量:代表是本*.C文件内私有变量,且静态存储,其他*.C(即使用extern声明也)不能调用。

(2)用于内部变量:代表是本函数内私有变量,且静态存储。

2. Static:用于函数时,代表是本*.C文件私有函数,其他*.C(即使用extern声明也)不能调用。

Static:静态的:用于外部变量或函数时,代表作用域;用于内部变量时,代表生存周期。

 

补充:基本概念

对于C++中经常出现的函数名称相同但是参数列表或者返回值不同的函数,主要存在三种情况:

 

1.函数重写(override)

函数重载主要实现了父类与子类之间的多态性,子类中定义与父类中名称和参数以及返回值都相同的虚函数。

1)重写的函数不能是static函数,必须是virtual函数,即函数在原始的基类中被声明为虚函数;

2)重写函数与基类函数分在两个类的声明和定义中,这也就导致二者的作用域不同;

3)重写函数的名称、参数列表以及返回值(即函数原型)都要与基类的函数相同;

4)重写函数的访问修饰符可以不同,尽管virtual函数是private的,在派生类中重写的函数可以是public或protect的、

 

2.函数重载(overload)

指函数名称相同但是参数类型或者参数顺序不同的相同作用域中的函数,函数重载不能靠返回值来进行区分;

 

3.重定义(redefine)

指子类重新定义父类中的非虚函数(参数列表可以不同),这样父类中的对应函数将被隐藏。

 

二、重写(override)与重载(overload)的区别

 

1、函数重写是子类和父类之间的继承关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系;

2、重写需要子类和父类中的两个函数的函数原型完全相同;重载要求两个函数参数列表不同;

3、在重写关系中,调用具体调用哪一个函数是根据(对象对应存储空间的实际类型)为准的,这涉及到动态绑定和静态绑定的问题,也就是虚函数的调用机制,而函数重载主要是靠形参列表的不同来区分具体调用哪个函数的。