24、C++程序下列说法正确的有( )
A)对调用的虚函数和模板类都进行迟后编译
B)基类与子类中函数如果要构成虚函数,除了要求在基类中用virtual声明,而且必须名字相同且参数类型相同返回类型相同
C)重载的类成员函数都必须要:或者返回类型不同,或者参数数目不同,或者参数序列的类型不同
D)静态成员函数和内联函数不能是虚函数,友员函数和构造函数也不能使虚函数,但是析构函数可以。
ABD
迟后编译:编译的时候,无法确定具体的执行情况
调用虚函数与多态不同,多态分为静态多态和动态多态,动态多态是动态捆绑的,是迟后编译
但静态多态是通过重载或模板实现,静态编译发时候可以确定
模板的迟后编译:定义时,无法确定类型,所以是迟后编译,调用时会再次编译
template
eg:vector
C错误 返回类型没有要求
30、 一动态链接库发布的导出类如下,以下哪种做法对该类的更新是没有问题的?(只列出改动部分)
class __declspec(dellexport)PubliClass
{
public:
virtual void A();
virtual void B();
void C();
friend void D();
//...
}; // 和以前不同不行
A: class PubliClass{/*...*/ };
B: virtual void B(); virtual void A();
C: void C()const;
D: void D();
B
动态链接库(Dynamic Link Library,简称DLL)是一种在Windows操作系统中使用的可执行文件格式,它包含了可以被其他程序或DLL在运行时调用的函数和数据。在Linux和其他类Unix系统中,类似的文件被称为共享库(Shared Library),通常以.so为文件扩展名。
动态链接库发布的导出类是指在一个DLL中定义并可以被其他程序或DLL使用的类。这些类通常包含一些可以被外部访问的成员函数和数据成员。为了使这些类在DLL外部可用,需要使用特定的关键字或宏来声明它们,以便它们在DLL的导出表中可见。
A错误 A完全重定义了类,而没有提供任何成员函数的实现,这显然会破坏二进制兼容性,因为类的所有成员函数都需要重新链接到新的实现上。
B正确 B仅仅改变了成员函数的声明顺序。在C++中,虚函数的顺序变化不会影响二进制兼容性,只要函数的签名(返回类型、函数名、参数类型和数量)没有改变
C错误 C改变了成员函数C的签名,添加了const关键字。这是一个二进制不兼容的改动,因为const成员函数和非const成员函数被视为不同的函数,这会破坏已有代码的链接
D错误 D试图将友元函数D变成类的成员函数。这是不正确的,因为友元函数不是类的成员,这种改动会改变类的接口,导致二进制不兼容__declspec(dllexport) 是Microsoft Visual C++中的一个特定于编译器的扩展,它用于在编译时指示编译器,随后的声明或定义应该被导出,使其在生成的动态链接库(DLL)中对外部可见。
__declspec(dellexport)PubliClass:
__declspec: 这是一个编译器特定的关键字,用于指定变量的存储类信息。
(dllexport): 这是 __declspec 的一个参数,用于指示随后的项(在本例中是类 PubliClass)应该被导出,即它应该在DLL的导出表中列出,这样其他程序或DLL就可以使用它。
PubliClass: 这是你要导出的类的名称。
当你在DLL项目中使用 __declspec(dllexport) 时,它告诉编译器和链接器,PubliClass 类的所有公共成员(包括构造函数、析构函数、成员函数和数据成员)都应该被导出,使得其他应用程序或DLL可以创建这个类的实例,调用其成员函数,或者访问其数据成员。
例如:
// MyDll.h
#ifdef EXPORTING_DLL
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
class DLL_API PubliClass {
public:
PubliClass();
virtual ~PubliClass();
// ... 其他公共成员 ...
};
在这个例子中,EXPORTING_DLL 宏在DLL项目的编译时定义,而 DLL_API 宏则根据是否导出或导入来展开为 __declspec(dllexport) 或 __declspec(dllimport)。当其他应用程序或DLL想要使用 PubliClass 时,它们会包含这个头文件,并定义 DLL_API 为 __declspec(dllimport),这样它们就可以导入 PubliClass 类而不需要知道其实现细节。
31、有一段年代久远的C++代码,内部逻辑复杂,现在需要利用其实现一个新的需求,假定有以下可行的方案,
应当优先选择:
A、修改老代码的接口,满足新的需求
B、将老代码抛弃,自己重新实现类似的逻辑
C、修改老代码的内部逻辑,满足新的需求
D、这段代码之外,写一段代码,调用该代码的一些模块,完成新功能需求
D
32.下面那个操作符不能重载()
A. =
B. <
C.sizeof
D.%
C sizeof内建,是根基,不可以重载
33.派生类的对象对它的基类成员中,()是可以访问的
A、公有继承的公有成员
B、公有继承的私有成员
C、公有继承的保护成员
D、私有继承的公有成员
A 对象如果在类外,保护的不可以;对象在类内,可以
34.下面关于顺序容器使用的描述哪个是错误的()
A、需要随机访问某个元素应该使用vector或者deque
B、需要在头部和尾部插入元素的应该使用vector
C、需要在中间插入或者删除元素的应该使用list
D、如果需要考虑空间问题,元素较多时,尽量不使用list
AB
A错误 随机访问指查找到在O(1)时间内找到,与存储位置无关,使用链表查找慢
B错误
D正确 list里面含有数据域和指针域,数据多,要分出一般的空间存储指针
35.类B是类A的公有派生类,类A和类B都定义了虚函数func(), ptr是指向类B的指针,则ptr->A::func()将
A、即调用类A的函数也调用B类的函数
B、根据ptr所指的对象类型确定调用类A或类B中的函数
C、调用类B中的函数
D、调用类A中的函数
D 含有A::,确定调用A类的函数,编译时确定
36.下面程序的输出是什么()
#include
class A
{public:
A() { std::cout << "A is created." << std::endl; }
~A(){ std::cout << "A is deleted." << std::endl; }
};
class B :public A
{public:
B(){ std::cout << "B is created." << std::endl; }
~B(){ std::cout << "B is deleted." << std::endl; }
};
int _tmain(int argc, _TCHAR *argv[])
{
A *pA = new B();
delete pA;
return 0;
}
A.B is created.A is deleted.
B.B is created.B is deleted.
C.A is created.B is created.A is deleted.
D.A is created.B is created.B is deleted.A is deleted.
C 只有父类的被回收
37.下列的程序的输出结果是()
#include
using namespace std;
class A
{public:
int _a;
A(){ _a = 1; }
void print(){ printf("%d",_a); }
};
class B:public A
{public:
int _a;
B(){ _a = 2; }
};
int main()
{
B b;
b.print();
printf("%d",b._a);
return 0;
}
A 2 2
B 1 1
C 1 2
D 2 1
C 空间独立,不会覆盖
38. 下列情况中,哪一种情况不会调用拷贝构造函数()
A 用派生类的对象取初始化基类对象时
B 将类的一个对象赋值给该类的另一个对象时
C 函数的形参是类的对象,调用函数进行形参和实参结合时
D 函数的返回值是类的对象,函数执行返回调用者时
B不会 赋值是重载操作符
class A
{
A(const A&a)
{
}
}
class B:public A
{
}
B b;
A a(b);
39.下面关于构造函数和析构函数的描述,错误的是()
A 析构函数中调用虚函数采用静态联编
B 对析构函数的调用可以采用动态联编
C 当基类的析构函数是虚函数时,其派生类的析构函数也一定是虚函数
D 构造函数可以声明为虚函数
A正确 在构造和析构中,调用虚函数,一定是静态的,是编译时确定的
D
40.下列有关于继承和派生的叙述中,正确的是()
A 派生类不能访问积基类的保护成员
B 作为虚基类的类不能被实例化
C 派生类应当向基类的构造函数传递参数
D 虚函数必须在派生类中重新实现
C
B 虚基类的类:虚继承的父类可以实例化
41.函数参数使用的空间是在()中申请的,malloc和new实在()中申请的
A 堆,栈
B 栈 ,堆
C 栈,栈
D堆,堆
B
42.适宜采用inline 定义函数情况是()
A 函数体含有循环语句
B 函数体含有递归语句
C 函数代码少 频繁调用
D 函数代码多 不常调用
C 编译建议,不是强制内联
43.下列不能作为类的成员的是()
A 自身类对象的指针
B 自身类对象
C 自身类对象的引用
D 另一个类的对象
B 会循环构造
C 可以
44.友元关系不能
A 提高程序的运行效率
B 是类与类的关系
C 是一个类的成员函数与另一个类的关系
D 继承
D
45.有关C++编译指令,以下叙述正确的是()
A C++的编译指令可以以#或//开始
B C++中不管#if后的常量表达式是否为真,该部分都需要编译
C C++每行不可以写多条编译指令
D #include指令中的文件名不可以含有路径信息
C
编译指令:#...编译指令
A错误 注释不行
B错误 #if为假,灰色的,不参与编译
46.假定A为一个类,则执行"A a(2),b[3],*p[4];"语句时调用该类构造函数的次数为()
A.3
B.4
C.5
D.9
B 在执行语句 "A a(2), b[3], *p[4];" 时,构造函数的调用次数如下:
A a(2); 调用了一次构造函数,以初始化对象 a。
A b[3]; 是一个对象数组,它包含3个 A 类型的对象,所以构造函数被调用了3次,分别用于初始化 b[0]、b[1] 和 b[2]。
A *p[4]; 是一个指针数组,它本身不调用构造函数,因为它只是分配了4个指向 A 类型的指针的空间,而没有创建 A 类型的对象。
因此,构造函数总共被调用了 1 + 3 = 4 次。
加A a1(a)调用拷贝构造 加A&refa=a;是起别名
47.已知p是一个指向类A数据成员m的指针,a是类A的一个对象。如果要给m赋值为5正确的是()
A.a.p=5;
B.a->p=5;
C.a.*p=5;
D.*a.p=5;
A·
48.已知f1和f2是同一类的两个成员函数,但f1不能直接调用f2,这说明()
A.f1和f2都是静态函数
B.f1不是静态函数,f2是静态函数
C.f1是静态函数,f2不是静态函数
D.f1和f2都不是静态函数
C
49.下列说明语句中正确的是:()
A.int a,&ra=a,&&ref=ra;
B.int &refa[[10];
C.int a,&ra=a,&*refp=&ra;
D.int *pi,*&pref=pi;
C
A. int a, &raa, &&refra;
int a; 是正确的,声明了一个整型变量 a。
&raa; 是正确的,声明了一个整型引用 raa。但是,由于它没有在声明时立即初始化,这在某些编译器上可能会报错,因为引用在声明时必须初始化。
&&refra; 是错误的,因为在 C++ 中不存在 "引用的引用" 这种类型。引用必须是直接绑定到一个对象上,不能引用另一个引用。
B. int &refa[[10];
int &refa[[10]; 是错误的,因为它的语法不正确。首先,方括号 [[ 应该是单个方括号 [,其次,引用不能用于声明数组。正确的数组声明应该是 int refa[10];,但 refa 不能是引用,因为数组元素需要具体的地址来分配空间,而引用只是一个已存在对象的别名。
C. int a, &raa, &refp&ra;
int a; 是正确的,声明了一个整型变量 a。
&raa; 是正确的,声明了一个整型引用 raa,但同样需要在声明时初始化。
&refp&ra; 是错误的,因为这部分语法没有意义。&refp 看起来像是要声明一个引用,但是紧接着的 &ra 是一个错误的操作。引用不能这样声明,且 ra 在这里没有先被声明。
D. int pi, &prefpi;
int pi; 是正确的,声明了一个整型变量 pi。
&prefpi; 是正确的,声明了一个整型引用 prefpi。但是,这个引用没有在声明时初始化,所以这可能会在编译时产生错误。如果 prefpi 在后面被正确地初始化为指向 pi 的引用,那么这个声明就是有效的。
综上所述,所有选项都有问题,但如果考虑到初始化的问题,选项 D 在语法上是正确的,只要确保 prefpi 在使用前被正确初始化。在实际编程中,引用必须在声明时初始化,所以如果这些选项出现在实际的代码中,它们都需要修正。
50.此设计模式定义一组可选算法,执行逻辑时根据环境选择算法,不同算法产生不同输出结果. 以下哪种设计模式符合描述()
A.工厂facttory
B.抽象工厂abstract factory
C.策略strategy
D.观察者observer
C
51.请为以下场合选择合适的容器,需要频繁进行插入和删除_(1)_,需要在内存中快速查找_(2)_,需要在磁盘中快速查找_(3)_()
A.vector/map/list
B.list/hash map/b tree
C.deque/tree map/vector
D.list/vector/map
B 磁盘红黑树
52.C++STL中list使用的迭代器类型是()
A.Input iterator B.Forward iterator
C.Bidirectional iterator D.Random Access iterator
C
53.如果在一个有序的vector/map/set中进行数据查找,哪一个查找复杂度更低( )
A.vector B.map C.set D.时间复杂度一样
D
54.以下关于STL容器描述正确的是(C)
A.STL容器是多线程安全的
B.STL容器中vector查找效率一般比map快
C.往STL容器放入对象是直接拷贝了一份对象到容器中,这部分内存由容器管理释放 拷贝构造
D.STL中的stack是采用红黑树实现的
mapm_map;
实现A的时候需要注意什么?重载操作符<>
map由红黑树实现
unordered_mapm_map;
实现A的时候需要注意什么?重载操作符==判断相等 实现取哈希的函数
unordered_map由哈希表实现
55.一个类的友元函数能够访问该类(D)
A.私有成员
B.保护成员
C.公有成员
D.所有成员
56.下列关于赋值运算符"=" 重载的描述中,正确的是(A).
A.赋值运算符只能作为类的成员函数重载
B.默认的赋值运算符实现了“深层赋值”功能
C.重载的赋值运算符函数有两个本类对象作为形参
D.如果已经定义了复制(拷贝构造函数),就不能重载赋值运算符
57.已知fl(int )是类A的公有成员函数,P是指向成员函数f1()的指针,以下赋值写法正确的是p = &A::f1;
58.抽象基类是指(C)
A.嵌套类
B.派生类
C.含有纯虚函数
D.多继承类
59. 下面说法正确的是(BC)
A:static函数在内存中只有一份,而其他非static函数每被调用一次内存中就会维持一份拷贝
B:程序的局部变量存在于堆栈中,全局变量存在与静态区中,动态申请数据存在于堆中
C:char *const p,语句定义了常用量指针,p的值不可以修改,char const *p;语句中指向常量的指针,指向的常量值不可更改。
D: (void*)ptr和(*(void**))ptr的结果是相同的。其中(ptr为同一个指针)
60. 关于delete描述符下列描述正确的是BD
A:它必须用于new返回的指针
B:使用它删除对象时会调用析构函数
C:对于一个指针可以使用多次该运算符
D:( 使用delete删除数组时 )指针名前只有一对方括号符号,不管所删除数组的位数
61.请问这个程序输出是什么?并说出原因?调用一次析构函数,程序会崩溃
#include"stdafx.h"
#include
class Book
{
public:
Book(){ std::cout << "Book\n";}
~Book(){ std::cout << "~Book\n";}
};
int main()
{
Book* pBook = new Book[3];
delete pBook;
return 0;
}
62.请写出下面程序的执行结果
class base
{
public:
virtual void vrfun(){printf("base::vrfun()\n");}
void fun(){printf("base::fun()\n");}
};
class derive : public base
{
public:
virtual void vrfun(){printf("derive::vrfun()\n");}
void fun(){printf("derive::fun()\n");}
};
void main()
{
base baseObj;
derive deriveObj;
base* pBase = &baseObj;
pBase->vrfun();//base::vrfun()
pBase->fun();//base::fun()
pBase = &deriveObj;
pBase->vrfun(); //derive::vrfun()
pBase->fun();//base::fun()
}
63.请挑出下述代码执行过程中会发生的事件,并按顺序排列父类构造 子类构造 父类析构;
struct Base
{
int val;
Base():val(0){}
~Base(){};
};
struct Derived : public Base{
Derived(){}
~Derived(){};
};
Base *p = new Derived;
delete p;
64.下列代码运行的结果是:a:2 b:3 a:2 2
struct Foo
{
Foo(const char* name,int *p):m_name(name),m_p(p){
printf("%s:%d",name,++*p);
}
~Foo(){ printf("%s:%d",m_name,--*m_p); }
const char* m_name;
int* m_p;
};
void fun(int *p){
Foo a("a",p);
new Foo("b",p);
}
int main(){
int a =1;
fun(&a);
printf("%d\n",a);
return 0;
}
65.下列程序
class A
{
public:
void print(){cout << "This is A " << endl; }
};
class B : public A
{
public:
void print(){cout << "This is B " << endl; }
};
int main(){
A a; B b;
A* p1 = &a;
A* p2 = &b;
p1->print();
p2->print();
}
上述函数的会输出什么?
This is A
This is A
若A类print定义为虚函数,结果又是什么?
This is A
This is B
是不是一个父类写了一个virtual函数,如果子类覆盖它的函数不加virtual,也能实现多态?
是
static变量能否继承,为什么?
不能,静态是共用,不能继承
66.请考虑标记为A到J的语句在编译时可能出现的情况。如果能编译成功,请记为“RIGHT”,否则记为“ERROR”。
#include
#include
class Parent
{
public:
Parent(int var = -1){
m_nPub = var;
m_nPtd = var;
m_nPrt = var;
}
public:
int m_nPub;
protected:
int m_nPtd;
private:
int m_nPrt;
};
class Child1 : public Parent
{
public:
int GetPub(){return m_nPub;};
int GetPtd(){return m_nPtd;};
int GetPrt(){return m_nPrt;}; //A ERROR
};
class Child2 : protected Parent
{
public:
int GetPub(){return m_nPub;};
int GetPtd(){return m_nPtd;};
int GetPrt(){return m_nPrt;}; //B ERROR
};
class Child3 : private Parent
{
public:
int GetPub(){return m_nPub;};
int GetPtd(){return m_nPtd;};
int GetPrt(){return m_nPrt;}; //C ERROR
};
int main()
{
Child1 cd1;
Child2 cd2;
Child3 cd3;
int nVar = 0;
//public inherited
cd1.m_nPub = nVar; //D RIGHT
cd1.m_nPtd = nVar; //E ERROR
nVar = cd1.GetPtd(); //F RIGHT
//protected inherited
cd2.m_nPub = nVar; //G ERROR
nVar = cd2.GetPtd(); //H RIGHT
//private inherited
cd3.m_nPub = nVar; //I ERROR
nVar = cd3.GetPtd(); //J RIGHT
return 0;
}
67.下列程序的结果是什么?
#include
#include
#include
using namespace std;
class A
{
public:
char k[3];
virtual void aa(){};
};
class B : public virtual A
{
public:
char j[3];
virtual void bb(){};
};
class C : public virtual B
{
public:
char i[3];
virtual void cc(){};
};
int main(int argc,char *argv[])
{
cout<<"sizeof(A):"<
cout<<"sizeof(B):"<
cout<<"sizeof(C):"<
return 0;
}
68.Find the defects in each of the following programs,and explain why it id incorrect.
#include
using namespace std;
class Base{
public:
int val;
Base(){val=1;};
};
class Derive:Base{//默认为私有继承
public:
int val;
Derive(int i){val = Base::val+i;};
};
int main(int , char **, char**)
{
Derive d(10);
cout<
return 0;
}
69.Find the defects in each of the following programs,and explain why it id incorrect.
class base
{
private:
int i;
public:
base(int x){i=x;}
};
class derived:public base{
private int i;
public:
derived(int x,int y){i=x;}
void printTotal(){int total = i+base::i;}//base::i为私有,不可见
};
70.下面的程序有何错误?
#include
using namespace std;
class Shape
{
public:
Shape(){};
~Shape(){};
virtual void Dram()=0;
};
int main()
{
Shape s1;
}
含有纯虚函数的类不能实例化对象
71.哪一种成员变量可以在同一个类的实例中共享?静态
72.请问下面程序打印的结果是什么?
#include
#include
using namespace std;
class base
{
private:
int m_i;
int m_j;
public:
base(int i):m_j(i),m_i(m_j){}
base():m_j(0),m_i(m_j){}
int get_i(){return m_i;}
int get_j(){return m_j;}
};
int main()
{
base obj(98);
cout << obj.get_i() << endl; //不确定值
cout << obj.get_j() << endl; //98
return 0;
}
73.请看下面一段程序:
#include
#include
using namespace std;
class B
{
private:
int data;
public:
(1)B(){cout << "default constructor" << endl; }
(2)B(const B & b){ cout << " copy constructor" <
(3)B& operator = ( const B & b) {cout << " operator = " <
(4)~B(){ cout << "destructed" << endl;}
(5)B(int i):data(i) { cout << "constructed by parameter" << data << endl;}
};
B play(B b){//类型转换,给形参有参构造(5)
return b;//给返回值(临时对象)拷贝构造(2) 形参回收(4)
}
int main(){
B temp = play(5);//类型转换,临时对象给temp拷贝构造(2),临时对象回收(4)
return 0;//temp回收(4)
}
1).该程序输出的结果是什么?为什么会有这样的输出?
本是(5) (2) (4) (2) (4) (4),但是由于返回值优化,temp给临时对象拷贝构造,临时对象给temp拷贝构造,构造两次没有必要,只需要形参给temp拷贝构造,然后形参回收就可以了,这样就避免了临时对象的创建和销毁。
(5)类型转换,给形参有参构造
(2)形参给temp拷贝构造
(4)形参回收
(4)temp回收
2).B(int i):data(i) ,这种用法的专业术语叫什么?初始化列表
3).play(5),形参类型是类,而5是个常量,这样写合法吗?为什么?
合法,发生了隐式类型转换。
4)B temp ;
temp = play(5);
=处发生了一次拷贝构造(给临时对象拷贝构造),临时对象给temp赋值。
所以输出为(1)temp的无参构造(5)类型转换,形参的有参构造(2)返回值(临时对象)的拷贝构造(4)形参的回收(3)临时对象给temp赋值(4)临时对象的回收(4)temp的回收
关键字explicit防止发生类型转换而产生对象。
74.阅读下面的程序段,写出运行结果
#include
#include
using namespace std;
int main(int argc ,char *argv[])
{
string eName(“Innovation Works”);
string cName(“创新工场”);
string& rs = eName;
string*ps = &eName;
rs = cName;//赋值
cout <
ps = &eName;
cout << *ps<
}
75.class A
{
Public:
Fun1() {printf(“Hello,world!\n”);}
Fun2() {printf(“a=%d\n”,a);}
Private:
int a;
}
A *p = NULL;
p->Fun1();//正常输出
p->Fun2();//崩溃,使用了this指针,而指针为空
问:p->Fun1(),p->Fun2()有一个能正常输出,请指出函数并解释原因。
76.
class CSample
{
public:
CSample(){}
virtual ~CSample(){}; //虚析构,也是虚函数,有虚指针
short m_A;
char m_B;
int m_C;
};
32位系统下编译器以四字节对齐的方式编译代码时,sizeof(CSample)的值是:12。
77. 看下面的代码,写出运行结果
#include
using namespace std;
class A{
public:
A(){
cout<<”A::A()called”<
init();//构造或析构中调用虚函数是静态联编
}
virtual ~A(){cout<<”A::~A()called”<
virtual void init(){cout<<”A::init()called”<
virtual void method(){cout<<”A::method()called”<
};
class B:public A
{
public:
B():A(){ cout<<”B::B()called”<
~B(){ cout<<”B::~B()called”<
void init(){ cout<<”B::init()called”<
void method(){ cout<<”B::method()called”<
};
void main(){
A *a=new B();
a->method();
delete a;
}
A::A()called
A::init()called
B::B()called
B::method()called
B::~B()called
A::~A()called
78.请仔细阅读以下代码,你觉得有问题吗?若没有问题,请将运行写出来,若有问题,请在更正后将运行结果写出来。
class A
{
public:
A(){};
~A(){};
void allocateMemory(char* lpTarget)
{
lpTarget = (char*)malloc(29);
}
void setNewData()
{
this->allocateMemory(this->m_lpNewData);
strcpy(m_lpNewData,”Roman wasn’t built in a day.\n”);
printf(m_lpNewData);
}
private:
char * m_lpNewData;
char m_cMyChar;
short int m_siMyAge;
long m_lMyYear;
};
int main(int argc,char *argv[])
{
A a;
printf(“len(a)=%02x.\n”,sizeof(A));
a. setNewData();
}
allocateMemory的参数类型有问题,应为char*&;发生了内存泄漏,所以要在析构函数中释放空间。
输出为len(a) = 0c.Roman wasn't built in a day.
79.假定Myclass为一个类,则执行Myclass a[12],*p[30];语句时,自动调用该类构造函数12次。
80.C++通过模板可以把类型定义为参数,从而实现了真正的代码可重用性。
81.请看以下程序,其实现了一个简单算法:取两个对象中较小的值。
//Test.cpp
#include
using std::cout;
using std::endl;
//请在下面填上恰当的语句,使得函数定义完整。
template
T min(T x, T y)
{
return (x < y)? x:y;
}
void main()
{
int n1 =2, n2 = 10:
double d1 = 1.5,d2 = 5.6;
cout <<"较小整数"<< min(n1,n2)<
cout<<"较小实数"<< min(n1,n2)<< endl;
system("PAUSE");
}
82.设px是指向一个类动态对象的指针变量,则执行“delete px”;语句时,将自动调用该类析构函数.
83.在C++语言程序中,有如下函数定义:
void fun(int a,int &b){a++;b++;}
执行代码段:
int x=0,y=1;
fun(x,y);
则变量x,y的值分别是(0,2)
84.抽象类中至少要有一个纯虚函数。
85.根据下面模板类的声明,请写出其构造函数.
template
class NamePtr
{
public:
NamePtr(const string& initName,T *initPtr);
private:
const string name;
T *const ptr;
}
template
NamePtr
::NamePtr(const string& initName,T *initPtr){ }
86.C++函数可以通过以下方式重载(overload):函数名相同,参数列表不同.不能通过返回值实现函数重载,因为程序执行时返回值可能会丢弃.
87.为避免在不知情的情况下构造出某个C++类的对象,应在此类的构造函数前使用explicit关键字.
88.设类A有成员函数void f(void);若要定义一个指向类成员函数的指针变量pf来指向f,该指针变量的声明语句是void (A::*pf)(void) = &A::f;.
89.找出下列代码段中有错误或可以优化的地方,简述理由
#include
using namespace std;
class BaseObject
{
public:
BaseObject(){
m_nCount = 0;
m_pData = new int[100];
}
~BaseObject(){
if(m_pData)delete []m_pData;
}
BaseObject(const BaseObject &t){
m_nCount = t.m_nCount;
//给m_pData辅赋值,深拷贝,memcpy
}
int Squre(volatile int *p){//volatile不在缓存中取值,每次都在内存取,避免缓存和内存不一致的情况
return *p * *p;//int temp = *p;return temp * temp;
}
void ChangeData()const{
m_nCount++;//常函数不能修改值
}
private:
int m_nCount;
int *m_pData;
};
int main(){
BaseObject object1;
BaseObject object2 = object1;
return 0;
}
90.有以下类的定义及调用代码片断:
class A
{
public:
A(){printf("A1\n");}
virtual ~A(){printf("A2\n");}
};
class B: public A
{
public:
B(){printf("B1\n");}
B(const B&o){printf("B2\n");}
B&operator=(const B&o){
printf("B3\n");
return *this;
}
~B(){printf("B4\n");}
};
void Test()
{
B b1;//A1 B1
B b2=b1;//A1 B2
b2=b1;//B3
B&b3(b1);//无输出
B&b4=b2;//无输出
}//B4 A2 B4 A2
请写出调用Test函数后的屏幕输出结果。