当前位置:编程学习 > C/C++ >>

[C++面试题]之面向对象

 

说到面向对象,大家第一反应应该就是它的三大特性:封装性、继承性和多态性。那么我们先简单的了解一下这三大特性:

 

     (1)封装性:封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

 

在C++中类中成员的属性有:public,protected,private,这三个属性的访问权限依次降低。

 

     (2)继承性:继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

 

     (3)多态性:多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,覆盖,重载。

 

覆盖,是指子类重新定义父类的虚函数的做法。

 

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

 

下面开始我们今天的学习。

 

1、C++中空类默认产生哪些类成员函数?

答案:

 

对于一个空类,编译器默认产生4个成员函数:

 

(1)默认构造函数

 

(2)析构函数

 

(3)拷贝构造函数

 

(4)赋值函数

 

 

2、结构是否可以有构造函数、析构函数及成员函数?如果可以,那么结构和类还有什么区别吗?

答案:

 

区别是class中变量默认是private,struct中的变量默认是public。class继承默认是private继承,而struct继承默认是public继承。struct可以有构造函数、析构函数,之间也可以继承甚至是多重继承,等等。C++中的struct其实和class意义一样,唯一不同就是struct里面默认的访问控制是public,class中默认访问控制是private。C++中存在struct关键字的唯一意义就是为了让C程序员有个归属感,是为了让C++编译器兼容以前用C开发的项目。

 

 

3、下面程序打印出的结果是什么?

01 #include<iostream> 

 

02 using namespace std; 

 

03   

 

04 class base 

 

05 { 

 

06 private: 

 

07     int m_i; 

 

08     int m_j; 

 

09 public: 

 

10     base( int i ) : m_j(i),m_i(m_j) {} 

 

11     base() : m_j(0),m_i(m_j){} 

 

12     int get_i() {return m_i;} 

 

13     int get_j() {return m_j;} 

 

14 }; 

 

15   

 

16 int main () 

 

17 { 

 

18     base obj(98); 

 

19     cout << obj.get_i() <<endl<< obj.get_j() <<endl; 

 

20     return 0; 

 

21 }

 

解析:本题想得到的结果是“98,98”。但是成员变量的声明是先m_i ,然后是m_j;初始化列表的初始化变量顺序是根据成员变量的声明顺序来执行的,因此,先初始化m_i,但此时m_j 还未初始化,m_i 会被赋予一个随机值。改变一下成员变量的声明顺序可以得到预想的结果。

 

答案:

 

输出结果第一个为随机数,第二个是98。

 

 

4、下面这个类声明正确吗?为什么?

1 class A  

 

2 { 

 

3     const int Size = 0; 

 

4 };

 

解析:这道程序题存在着成员变量问题。常量必须在构造函数的初始化列表里初始化或者将其设置成static。

 

答案:

 

正确的程序如下:

 

 

1 class A 

 

2 { 

 

3     A() 

 

4     { 

 

5         const int Size = 1; 

 

6     } 

 

7 };

 

 

或者:

 

1 class A 

 

2 { 

 

3     static const int Size = 1; 

 

4 };

 

 

5、析构函数可以为virtual 型,构造函数则不能,为什么?

答案:

 

虚函数采用一种虚调用的办法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为virtual。

 

 

6、如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数?

答案:

 

不行,这是因为虚函数是有代价的:由于每个虚函数的对象都必须维护一个v 表,因此在使用虚函数的时候会产生一个系统开销。如果仅是一个很小的类,且不行派生其他类,那么根本没必要使用虚函数。

 

 

7、请看下面一段程序:

01 #include<iostream> 

 

02 using namespace std; 

 

03   

 

04 class B 

 

05 { 

 

06 private: 

 

07     int data; 

 

08 public: 

 

09     B() 

 

10     { 

 

11         cout<<"defualt constructor"<<endl; 

 

12     } 

 

13   

 

14     ~B() 

 

15     { 

 

16         cout<<"destructed "<<endl; 

 

17     } 

 

18   

 

19     B( int i) : data(i) 

 

20     { 

 

21         cout<<"constructed by parameter"<<data<<endl; 

 

22     } 

 

23 }; 

 

24   

 

25 B Play( B b ) 

 

26 { 

 

27     return b; 

 

28 } 

 

29   

 

30 int main () 

 

31 { 

 

32     B temp = Play(5); 

 

33     return 0; 

 

34 }

 

问题:

 

       (1)该程序输出结果是什么?为什么会有这样的输出?

 

      (2)B( int i ) : data( i ),这种用法的专业术语叫什么?

 

      (3)Play( 5 ),形参类型是类,而5是个常量,这样写合法吗?为什么?

 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,