**1.叙述面向对象编程的特点是什么?(提示:封装、继承、多态。)**
对比面向过程具有抽象、封装、继承和多态的特点。
封装是将抽象得到的数据和行为相结合,形成了一个有机整体,使得一部分成员充当类与外部的接口,而将其他成员隐藏了起来达到了对成员访问权限的合理控制,使得不同类之间的影响最小,加强数据安全,简化编程。
继承允许在保持原有类特性的基础上,进行更具体、更详细的说明,能够很好反映出特殊概念和一般概念之间的关系,是代码复用的基础机制。
多态使得一段程序能够具有处理多种类型对象的能力,相同的消息在不同的对象下会有不同的动作,增强了编程的灵活性。
**2.使用const定义常量与用使用define定义常量相比,有什么优点?**
a. const常量有数据类型,而宏常量没有数据类型。编译器可以对const常量进行类型安全检查,而对宏常量只能字符替换
b. 有些集成化的调试工具能对const常量进行调试,对宏常量不能调试
c.const定义的常量在程序运行的过程中只有一份拷贝,而define定义的常量在内存中有若干拷贝。
**3.用代码说明在标准C++中如何进行输入输出,并解释各语句的含义是什么?**
cout<<"hello!"<<"world";
cin>>a>>b;
在输入时,从键盘输入的数据先放在键盘缓冲区中,当按回车键时,键盘缓冲区中的数据输入到程序中的输入缓冲区,形成cin流,然后用流提取运算符“>>”从输入缓冲区中提取数据送给程序中的有关变量。
当用cout和流插入运算符“<<”向显示器输出数据时,先将这些数据送到程序中的输出缓冲区保存,直到缓冲区满了或遇到endl,就将缓冲区中的全部数据送到显示器显示出来。
**4.C++中如何进行静态类型转换,解释并举例说明。**
(1)用于类层次结构中基类和派生类之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
```
class Base { }; class Derived:public Base {}; int main()
{
Derived D;
Base* B = static_cast<Base*> (&D); return 0;
}
```
将派生类型的指针转化为基类型的指针
(2)用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
double a; int b=100;
a = static_cast<double> (b);
(3)把空指针转换成目标类型的空指针(不安全!!)。
(4)把任何类型的表达式转换成void类型。
**5.阐述C++中函数三种调用的方式实现机制、特点及其实参、形参的格式,最好用代码说明。(提示:传址、传值、引用传递)**
在C++中调用函数时有三种参数传递方式:
(1)传值调用;
```
int main( )
{ void swap(int,int); //函数声明
int i=3,j=5;
swap(i,j); //调用函数swap
return 0;
} void swap(int a,int b) //企图通过形参a和b的值互换,实现实参i和j的值互换
{ int temp;
temp=a; //以下3行用来实现a和b的值互换
a=b;
b=temp;
}
```
(2)传址调用(传指针);
用指针类型作为形参的值调用方式,可以通过参数返回修改后的值。
```
void main( )
{ void swap(int *,int *); int i=3,j=5;
swap(&i,&j); //实参是变量的地址
} void swap(int *p1,int *p2) //形参是指针变量
{ int temp;
temp=*p1; //以下3行用来实现i和j的值互换
*p1=*p2; *p2=temp;
}
```
* * *
如果觉得看完文章有所收获的话,可以关注我一下哦
知乎:[秃顶之路](https://www.zhihu.com/people/mini-89-93-82)
b站:[linux亦有归途](https://space.bilibili.com/151088805)
每天都会更新我们的公开课录播以及编程干货和大厂面经
也可以直接点击[c/c++ linux服务器开发高级架构师](https://ke.qq.com/course/417774?flowToken=1026211)
来课堂上跟我们讲师面对面交流
需要大厂面经跟学习大纲的小伙伴可以加群973961276获取
(3)引用传递;
按引用传递,引用实参的引用参数传递给函数,而不是进行参数拷贝。引用类型的形参与相应的实参占用相同的内存空间,改变引用类型形参的值,相应实参的值也会随着变化。
```
int main( )
{ void swap(int &,int &); int i=3,j=5;
swap(i,j); return 0;
} void swap(int &a,int &b) //形参是引用类型
{ int temp;
temp=a;
a=b;
b=temp;
}
```
**6.什么是内联函数?为什么要使用内联函数?**
在编译时将所调用函数的代码直接嵌入到主调函数中,而不是将流程转出去,这种嵌入到主调函数中的函数成为内联函数。
为了节省参数传递、控制转换等开销,比如:压栈、弹栈、保存现场与恢复现场。
**7.什么是类的前向声明?使用类的前向声明时,要注意什么?**
遇到俩个类相互引用的循环依赖情况
```
class B; //前向引用声明
class A//A类的定义
{ public://外部接口
void f(B b);//以B类对象b为形参的成员函数
}; class B//B类的定义
{ public://外部接口
void g(A a);//以A类对象a为形参的成员函数
};
```
前向引用声明,是在引用未定义的类之前,声明该类,使编译器知道那是一个类名。这样,当程序中使用这个类名时,编译器就不会认为是错误,而类的完整定义可以在程序的其他地方。
注意:尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能定义该类的对象,也不能在成员函数中使用该类的对象。只能用于定义指针、引用、以及用于函数形参的指针和引用。当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。
**8.什么是先验条件(Precondition),什么是后置条件(Postcondition)?(google)**
先演条件是在执行某段代码或正式规范操作之前必须始终为真的条件或谓词。比如输入一个时间必须小于24。
后置条件是在执行某段代码或正式规范操作之后必须始终为真的条件或谓词。比如计算输入数字的平方根程序可能具有结果为数字的后置条件,且其平方等于输入。
**9.什么是名称空间(namespace)?它的主要作用是什么?要使用一个名称空间中声明的标识符,方式有哪些?**
A namespace is a scope.
C++ provides namespaces to prevent name conflicts
名字空间实质上是一种作用域。名字空间是一种描述逻辑分组的机制,是为了解决C++中的变量、函数命名冲突而服务的。
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
a、直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
```
#include <iostream> std::cout << "hello!!"<< std::endl;
```
b、使用using关键字进行声明
显然,当某个名字在它自己的名字空间之外频繁使用时,在反复写它时都要加上名字空间来作限定词,是一件令人厌烦的事情。这时,可以通过一个使用声明而清楚掉,只需要在某个地方说明,在这个作用域其后的代码中,使用此名字时可以自动解析出此名字所在的空间。例如:
```
#include <iostream>
using s