1关于new运算符,错误的是D
A可以用来动态创建对象和对象数组
B使用它创建的对象和对象数组可以使用运算符delete删除
C使用它创建对象时要调用构造函数
D使用它创建对象数组时必须指定初始值
分析:D 可以不指定初始值,调用默认构造函数进行默认初始化。
int*x=new int();//不传值,默认初始化为0
2free释放内存之后,指针还指向原来的那块地址,需要我们设置p=NULL;如果我们不手动设置p=NULL;此时p就变成了野指针。
free掉一个指针后,指针仍然指向原来的地址。free的意义在于告诉系统目标地址可以被回收。
32 位系统中MAR(内存地址寄存器)为32位,可寻址范围为2的32次方Byte,共大约不足4G的内存空间。指针中保存内存地址,所以大小和MAR大小相同。
指针的类型用于确定指针所指的对象的类型,因此初始化或赋值时必须保证类型匹配。指针用于间接访问对象,并给予指针的类型提供可执行的操作,例如,int型指针只能把其指向的对象当作int型数据来处理,如果该指针指向了其他类型(如double类型)的对象,则在指针上执行的任何操作都有可能出错。
一个有效的指针必然是以下三种状态之一:
保存一个特定的对象的地址;
指向某个对象后面的另一对象;
或者是0值。
3分解质因数
#include<iostream>
using namespace std;
void prim(int m,int n) {
if(m>=n) {
while(m%n)
n++;
m/=n;
prim(m,n);
cout<<n<<endl;
}
}
int main() {
prim(6,2);
}
分析:n从2开始。第一处为m%n,代表取余。当余数是0的时候表示除尽,跳出while循环,即找出一个质因数。此时一个质因数即为n。
然后 m/=n 即让m除去这个质因数,然后再进入求新m质因数的递归。
举例:m=6,n=2
m>n;
m%n=0,跳出while,n没有加1。此时m=6,n=2
m/=n,此时m=3,n=2 (2为一个质因数)
递归prim(m, n),即prim(3,2);
m>n;
m%n=1,n++,此时m=3,n=3,继续while循环
m%n=0,跳出while循环,此时 m=3,n=3 (3为另一个质因数)
m/=n,此时m=1,n=3
递归 prim(m,n),即 prim(1,3);
不满足条件(m > n),返回上层
输出质因数 n=3
输出质因数 n = 2
4程序最小单位是函数,程序是由若干个函数组成。
5 当一个类的某个函数被声明为virtual,则在该类的所有派生类中的同原型函数都是虚函数。
分析:《C++ Primer》第五版,P537 页:“当在派生类中覆盖某个虚函数时,可以再一次使用virtual关键字指出该函数的性质。然而这么做并非必须,因为一旦某个函
数被声明为虚函数,则在所有派生类中它都是虚函数”
a.成员函数被重载的特征:
(1)相同的范围(在同一个类中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。
b.覆盖是指派生类函数覆盖基类函数,特征是:
(1)不同的范围(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有virtual 关键字。
c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
(1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。
(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual 关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)
6关于C/C++的宏定义,不正确的B
A宏定义不检查参数正确性,会有安全隐患
B宏定义的常量更容易理解,如果可以使用宏定义常量的话,要避免使用const常量
C宏的嵌套定义过多会影响程序的可读性,而且容易出错
D相对于函数调用,宏定义可以提高程序的运行效率
分析:const关键字定义常量比宏安全。尽量以const替换define。尽可能使用const,enum,inline.
7下面模板声明中,哪些是非法的(BD)
Atemplate<classType>class C1{};
Btemplate<class T,U,classV>class C2{};
Ctemplate<classC1,typename C2>class C3{};
Dtemplate<typename myT,class myT>class C4{};
分析:B选项的U参数没有指定类型, D选项的 2个形参名同名。
函数模板的格式:
template<class形参名,class形参名,......>返回类型函数名(参数列表)
{
函数体
}
类模板的格式为:
template<class形参名 ,class形参名,…>class类名
{... };
D选项的myT在这里是重定义。;typename 和 class 混用没有关系。