面向对象的基本概念
面试例题1:面向对象技术的基本概念是什么?
解析:按照定义,OO(面向对象)编程语言必须提供对象、类和继承。
答案:对象、类和继承。
面试例题2:C++中的空类默认产生哪些类成员函数?
Class Empty
{
Public;
};
解析:类的概念
答案:对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。
面试例题3:Which is incorrect about the class?(关于类,下面哪个叙述是错误的?)
A. A class is a blueprint to objects.(类是对象的设计蓝图)
B. 我们用关键字类来创建一个类的结构。
C. 一旦一个类被声明,这个类名可以用做一个类型名来声明变量。
D. 类和结构一样,两者没有任何区别。
解析:类的概念问题。见例5
答案:D
面试例题4:下面关于面向对象技术的叙述,哪个是错误的?
A. 面向对象的关键特点是使用软件对象来编程。
B. 面向对象程序提供了很多优势:简易化、模块化、易修改性、扩展性等等。
C. 面向对象的特点和面向过程的特点一样,重点在于一步一步的过程。
D. 面向对象的关键特点是数据过程的附加。
解析:OOP的概念问题。面向对象和面向过程不能混为一谈。
答案:C和D
面试例题5:类和结构struct和class的区别?
答案:在C++中两者的唯一区别是:struct里面默认的访问控制是public,class中默认的访问控制是private。
面试例题6:现有以下代码,则编译时会产生错误的是_____。
Struct Test
{
Test(int){}
Test(){}
Void fun(){}
};
Int main()
{
Test a(2);//语句1
a.fun();//语句2
Test b();//语句3
b.fun();//语句4
return 0;
}
A. 语句1 B.语句2 C.语句3 D.语句4
解析:Test b() 这个语法等同于声明了一个函数,函数名为b, 返回值为Test, 传入参数为空。但是实际上,代码作者是希望声明一个类型为Test,变量名为b的变量,应该写成Test b;, 但程序中这个错误在编译时是检测不出来的。出错的是b.fun(),它是编译不过去的。
答案:D。
面试例题7:哪一种成员变量可以在同一个类的实例之间共享?
答案:必须使用静态成员变量在一个类的所有实例间共享数据。如果想限制对静态成员变量的访问,则必须把它们声明为保护型或私有型。
不允许用静态成员变量去存放某一个对象的数据。 静态成员数据是在这个类的所有对象间共享的。 (疑惑↑)
面试例题8:指出下面程序的错误。如果把静态成员数据设为私有,该如何访问?
#include <iostream>
Using namespace std;
class Cat
{
public:
Cat(int age):itsAge(age) { HowManyCats++; }
virtual ~Cat(){ HowManyCats--; }
virtual int GetAge(){return itsAge;}
virtual void SetAge(int age) {itsAge = age;}
static int HowManyCats;
private:
int itsAge;
};
int main()
{
const int MaxCats = 5;
int i;
Cat* CatHouse[MaxCats];
for(i = 0; i < MaxCats; i++)
{
CatHouse[i] = new Cat(i);
}
for(i = 0; i < MaxCats; i++)
{
cout << ”THere are”;
cout << Cat::HowManyCats;
cout << ”cats left!\n”;
cout << ”Deleting the one which is”;
cout << CatHouse{i}->GetAge();
cout << ”years old\n”;
delete CatHouse[i];
CatHouse[i] = 0;
}
return 0;
}
答案:该程序错在设定了静态成员变量,却没有给静态成员变量赋初值。如果把静态成员数据设为私有,可以通过公有静态成员函数访问
#include <iostream>
Using namespace std;
Class Cat
{
public:
Cat(int age):itsAge(age) {HowManyCats++;}
Virtual ~Cat(){HowManyCats--;}
Virtual int GetAge(){return itsAge;}
Virtual void SetAge(int age) {itsAge = age;}
//static int HowManyCats;
Static int GetHowMany(){return HowManeCats;}
private:
int itsAge;
static int HowManyCats;
};
int cat::HowNamyCats = 0;
Void tele();
Int main()
{
Const int MaxCats = 5;
Int i;
Cat* CatHouse[MaxCats];
for(i = 0; i < MaxCats; i++)
{
CatHouse[i] = new Cat(i);
}
For(i = 0; i < MaxCats; i++)
{
cout<<”THere are”;
cout<<Cat::HowManyCats;
cout<<”cats left!\n”;
cout<<”Deleting the one which is”;
cout<<CatHouse{i}->GetAge();
cout<<”years old\n”;
Delete CatHouse[i];
CatHouse[i] = 0;
}
return 0;
}
Void tele()
{
cout<< “THere are” << Cat::GetHowMany() << “Cats alive!\n”;
}
面试例题9:找出下面程序的错误,并解释它为什么是错的。
#include<iostream>
using namespace std;
class Year
{
int y;
const int InitY = 1970;
public:
Year(){ y = InitY ;}
int year() const{ return y;};
void add_year(int i) {y = year() + i ;}
};
void main()
{
Year y1;
Year* const py1 = new Year();
y1.add_year(1);
py1->add_year(2);
cout<<y1.year() << “,” << py1->year() << endl;
return;
}
解析:这道程序题存在着成员变量问题 ,没有问题。
答案: (基本上都是错的,不要看↓)
#include<iostream>
using namespace std;
class Year{
int y;
static const int InitY = 1970; //错误1
public:
Year():{y = InitY;}; //错误2没有分号
int year() const{ return y;};
void add_year(int i) {y = year() + i};
};
int main() //错误3 在C++中不允许mai()的返回值为void
{
Year y1;
Year* const py1 = new Year();
y1.add_year(1);
py1->add_year(2);
cout<<y1.year() << “,” << py1->year() << endl;
return;
}
面试例题10: 这个类声明正确吗?为什么?
class A
{
public:
Const int Size = 0;
}
解析:这道程序体存在着成员变量问题。常量必须在构造函数的初始化列表里面初始化或者将其设置成static。 (ps:早期的编译器不能通过,现在的没问题。当然下面的程序也没有问题)
答案:
正确的程序如下:
class A
{
public:
A() { const int Size = 9; }
};
或者:
class A
{
public:
A() { static const int Size = 9; }
};