C++——面试问题

版权声明:转载请注明出处 https://blog.csdn.net/weixin_39540568/article/details/87889981

1、如何引用一个定义过的全局变量?全局变量能否在一个会被多个c文件包含的头文件中定义?为什么?

答:使用extern进行引用;不能,经过编程验证,编译时候会报错重复定义该全局变量。对于该问题,按照常规理解,头文件中进行了#ifndef/#define/#endif 的条件编译选项,是否就是说第二个.c文件编译obj文件时候应该跳过。答案不然,#ifndef/#define/#endif的作用是为了防止在一个c文件中重复包含两次头文件来做的处理,编译器在编译c文件时候是单独编译的,所以在生成的obj文件中就会出现两次全局变量的定义,导致出现问题。正确的使用方法是在一个c文件中定义,在其他c文件中通过extern进行引用。

2、类成员函数的重载、覆盖、隐藏的区别?

答:重载:1、同一范围,也即出现在同一个类中;2、函数名相同;3、传入参数不同;4、有无virtual关键字无影响;    效果:根据连接时候传入参数不同进行不同方法函数的调用

       覆盖:1、不同范围,通常出现在基类和派生类中;2、函数名相同;3、传入参数相同;4、含有关键字virtual;  效果:基类中同名方法被覆盖,基类指针的方法实际调用的是派生类中的方法。

      隐藏:情况一、不同范围,函数名相同,传入参数不同,不管有无virtual,基类方法被隐藏!

                情况二、不同范围,函数名相同,传入参数相同,不含virtual关键字,基类方法被隐藏!

网络上看到的一段关于隐藏的说法:其实,世界上本没有隐藏!!!不要庸人自扰,派生类指针永远只调用自己的成员函数,而由于基类指针由于virtual关键字的原因可能出现调用派生类的函数,这才是我们平时说的多态性!!!

以如下代码为例解释网络上的那句话

#include <iostream.h>
class Base
{
public:
virtual void f(float x){ cout << "Base::f(float) " << x << endl; }
void g(float x){ cout << "Base::g(float) " << x << endl; }
void h(float x){ cout << "Base::h(float) " << x << endl; }
};
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
void main(void)
{
Derived d;
Base *pb = &d;
Derived *pd = &d;
// Good : behavior depends solely on type of the object
pb->f(3.14f); // Derived::f(float) 3.14
pd->f(3.14f); // Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer
pb->g(3.14f); // Base::g(float) 3.14
pd->g(3.14f); // Derived::g(int) 3 (surprise!)
// Bad : behavior depends on type of the pointer
pb->h(3.14f); // Base::h(float) 3.14 (surprise!)
pd->h(3.14f); // Derived::h(float) 3.14
}

bp 和dp 指向同一地址,按理说运行结果应该是相同的,而事实上运行结果不同,所以他把原因归结为C++的隐藏规则,其实这一观点是错的。决定bp和dp调用函数运行结果的不是他们指向的地址,而是他们的指针类型。“只有在通过基类指针或引用间接指向派生类子类型时多态性才会起作用”(C++ Primer 3rd Edition)。pb是基类指针,pd是派生类指针,pd的所有函数调用都只是调用自己的函数,和多态性无关,所以pd的所有函数调用的结果都输出Derived::是完全正常的;pb的函数调用如果有virtual则根据多态性调用派生类的,如果没有virtual则是正常的静态函数调用,还是调用基类的,所以有virtual的f函数调用输出Derived::,其它两个没有virtual则还是输出Base::很正常啊,nothing surprise! 

以下为我自己针对该问题编写的测试代码:

3、关于宏定义#define的一道面试题目

     抓住一句话:宏定义就是将原本程序不做任何处理的展开,看以下两个程序,使用g++ -E main.cpp对程序进行只预处理不编译,可以看到宏的展开结果:

情况一:#define SQR(X) X*X

情况二  #define SQR(X) (X)*(X)

    

猜你喜欢

转载自blog.csdn.net/weixin_39540568/article/details/87889981