码迷,mamicode.com
首页 > 编程语言 > 详细

基本语言(三)

时间:2020-06-19 16:02:42      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:ati   span   运行   大小   完成   free   变量   隐式类型转换   ref   

如果同时定义了两个函数,一个带const,一个不带,会有问题吗?

不会,这相当于函数的重载。

请你来说一说隐式类型转换

首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换,其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该参数传入,编译器会自动调用其构造函数生成临时对象。

显示转换是强制转换,而隐式转换是编译器完成的

1 //隐式转换
2 char a = a;
3 int x = a;
1 //显式转换
2 int a = 10;
3 double x = (double)a;

说说你了解的类型转换

1. reinterpret_cast: 

可以用于任意类型的指针之间的转换,对转换的结果不做任何保证;

2. dynamic_cast:

这种其实也是不被推荐使用的,更多使用static_cast,dynamic本身只能用于存在虚函数的父子关系的强制类型转换,对于指针,转换失败则返回nullptr,对于引用,转换失败会抛出异常

注:用于多态型的父子类型对象的指针或引用之间。

3. const_cast:

对于未定义const版本的成员函数,我们通常需要使用const_cast来去除const引用对象的const,完成函数调用。另外一种使用方式,结合static_cast,可以在非const版本的成员函数内添加const,调用完const版本的成员函数后,再使用const_cast去除const限定。

注:这是一种安全的数据类型转换,目的是将const类型变更为非const类型,通常用于给函数的非const形参传const参数时进行转换。

4. static_cast:

用于基本数据类型之间的转换;同一个继承体系中类型的转换;把任何类型的表达式转换成void类型;把空指针转换成目标类型的空指针。

请你来说一说C++函数栈空间的最大值

默认是1M,不过可以调整。

注:函数栈空间的值不是由语言标准规定的,而是由编译器的具体实现决定的。比如VC的Debug/Release开关编bai译的程序开辟函du数栈的行为是有不同的。Release版是看函数内有多少变量,需要多少空间就开辟多少空间,而Debug版开辟的空间要大一些,并全部以0xcccccccc填充,以避免缓冲区溢出,保护函数栈。

请你来说一说extern“C”

C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字与C 语言不同。假设某个函数的原型为:void foo(int x, int y); 该函数被 C 编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C 连接交换指定符号 extern“C”来解决名字匹配问题。

请你回答一下new/delete与malloc/free的区别是什么

首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数

请你说说你了解的RTTI(Runtime Type Information)

RTTI,运行时类型信息。它提供了运行时确定对象类型的方法。C++中RTTI仅提供几个最基本的功能:

1. 安全的downcast,当你使用 dynamic_cast 动态从基类指针转换成子类指针的时候,RTTI能保证安全的转换,如果类型不符则抛出一个 bad_cast 异常;

2. 动态获取一个对象的类名称。你可以使用typeid获得一个type_info对象,这个对象保存了这个类型的最基本信息,比如名称。

3. 在继承树上便利,使用typeid获得的type_info对象提供一个before方法,可以用于查找这个类型的基类。

请你说一说虚函数表具体是怎样实现运行时多态的?

子类若重写父类虚函数,虚函数表中,该函数的地址会被替换,对于存在虚函数的类的对象,在VS中,对象的对象模型的头部存放指向虚函数表的指针,通过该机制实现多态。

请你说一说C语言是怎么进行函数调用的?

每一个函数调用都会分配函数栈,在栈内进行函数执行过程。调用前,先把返回地址压栈,然后把当前函数的esp指针压栈。

请你说说C语言参数压栈顺序?

从右到左。

请你说说C++如何处理返回值?

生成一个临时变量,把它的引用作为函数参数传入函数内。

请你回答一下C++中拷贝赋值函数的形参能否进行值传递?

不能。如果是这种情况下,调用拷贝构造函数的时候,首先要将实参传递给形参,这个传递的时候又要调用拷贝构造函数。如此循环,无法完成拷贝,栈也会满。

请你回答一下malloc与new区别

malloc需要给定申请内存的大小,返回的指针需要强转。
new会调用构造函数,不用指定内存大小,返回的指针不用强转。

请你说一说select

select 在使用前,先将需要监控的描述符对应的 bit位 置1,然后将其传给select,当有任何一个事件发生时,select 将会返回所有的描述符,需要在应用程序自己遍历去检查哪个描述符上有事件发生,效率很低,并且其不断在内核态和用户态进行描述符的拷贝,开销很大。

请你回答一下静态函数和虚函数的区别

静态函数:

在编译的时候就已经确定运行时机;

虚函数:

在运行的时候动态绑定。因为用了虚函数表机制,调用的时候会增加一次内存开销。

 

原文链接:https://www.nowcoder.com/tutorial/93/2a565e401f31468cabb3a378c60d5049

基本语言(三)

标签:ati   span   运行   大小   完成   free   变量   隐式类型转换   ref   

原文地址:https://www.cnblogs.com/john1015/p/13156941.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!