c++语言--面试题

发布于:2023-01-06 ⋅ 阅读:(542) ⋅ 点赞:(0)

1.c++和c有什么不同?

语言本身:c是c++的一个子集,c++在c的基础上增加了 类 和 模板 类型

一方面:c++加强了c的过程化功能,引入了 重载和异常处理等

另一方面:扩展了面向对象设计的内容  如:类,友元,继承,虚函数,模板

编程角度:c是一中结构化编程语言  重点在于算法和数据结构

               c++是面向对象的编程语言  重点在于如何设计对象模型

2.const和volatile的作用

const关键字作用于修饰普通变量和指针变量, 

如果修饰变量名,则该变量变成常变量,不能被修改 

如果修饰指针变量 const在c和c++中略有不同 

在c中,c的编译器并不会把const修饰的变量当成常量,会为其分配内存空间,c编译器不知道它在编译器时的值(c++可以)

 volatile关键字 含义:"易变的"

告诉编译器volatile变量随时可能发生变化的,与volatile变量有关的运算不要进行编译优化,每次使用它必须从volatile变量地址读取

何为编译优化?

int main()
{
	volatile int a = 10;
	int i = a;
	/*
	其他代码
	*/
	int j = a;
	return 0;
}

如果没有volatile  编译器发现两次从a的地址读数据的代码之间没有对a进行过操作,它会自动将上次a的值放到中, 

 给出几个使用volatile关键字的示例

1)多线程中被几个任务共享的变量

2)中断服务子程序会访问到的非自动变量

c++的显示类型转换

 1.静态转换(static_cast)

static_cast用于明确定义的转换,包括"安全"转换(int---long)和不安全转换(long---int会导致信息丢失)但知道定义的转换,使用void*强转转换隐式类型转换

#include<iostream>    
using namespace std;    
int main()    
{    
    int i=0x11223344;    
    long j;    
    double k;    
    //非强制安全转换 隐式转换    
    j=i;    
    k=i;    
    //也可以  突出转换行为    
    j=static_cast<long>(i);    
    k=static_cast<double>(i);    
    
        
    //非安全转换---导致信息丢失    
 //   i=j   //丢失数字    
  //  i=k   //丢失信息    
    i=static_cast<int>(j); //表示我知道  消除警报    
    i=static_cast<int>(k);   //    
    
    //                                                                                                                         
    void *vp=&i;    
    //旧时风格可能产生危险的转换    
    float* fp=(float*)vp;    
    //新方式    
    fp=static_cast<float*>(vp);    
    
    
    return 0;    
}

2.常量转换(const_cast)

从const转换为非const或者从volatile转换为非volatile可以使用const_cast

3.重解释转换(reinterpret_cast)

 4.动态转换(dynamic_cast)

用于类继承结构中实现类型安全的对象指针向下转换

内存管理

  •  代码段:用来存放程序的可执行代码,(可共享和只读的)
  • 数据段:包括未初始化区:存放未初始化(外部变量和静态局部变量)数据
  •                    静态数据区:已初始化的全局变量和静态局部变量和常量
  • 堆空间:用于存放程序执行动态分配的内存段
  • 栈空间:存放程序的临时局部变量和函数参数和返回地址

 malloc/free和new/delete的不同?

malloc/free是c语言的标准库函数

new/delete是c++中运算符

new运算符会自动调用对象的构造函数  delete会自动调用对象的析构函数

在c++中支持malloc/free 为什莫还需要new/delete?

因为malloc/free不满足为对象动态分配内存空间的要求,

对象在创建是要自动调用构造函数 销毁时要自动执行析构函数

malloc/free是库函数不是运算符所以不在编译器的控制权限之内,不能把执行构造函数和析构函数交给malloc/free

对于内置类型malloc/free和new/delete是等价的,为什么不把malloc/free淘汰掉?

因为c++经常要调用c函数,而纯c只能用malloc/free管理内存

函数传递方式?

  • 传值
  • 传引用
  • 传地址

函数采用引用传递的优点?

  • 用引用传递函数的参数能保证参数传递不产生临时变量,提高传递效率,节省空间
  • 引用参数定义为const 不能修改形参值,保证引用传递的安全性

  当引用作为函数返回值时遵守以下规则?

  1. 不要返回局部变量, 局部变量返回时会被销毁,

  2.  不要返回malloc/new分配的内存引用,  函数返回的引用只是作为一个临时变量出现,没有被赋予一个实际变量,那么这个引用所指的空间就无法释放,造成内存泄露.

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到