zoukankan      html  css  js  c++  java
  • 基本语言(三)

    如果同时定义了两个函数,一个带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

  • 相关阅读:
    HashMap和HashTable区别【转载】
    Linux常用指令【转载】
    遇到的eclipse启动报错问题解决
    个人总结
    结对编程之黄金点游戏
    第三周作业二
    vs2013的安装以及单元测试
    小学生整数四则运算
    对于迅雷下载器的评价
    关于软件工程的疑问
  • 原文地址:https://www.cnblogs.com/john1015/p/13156941.html
Copyright © 2011-2022 走看看