首页 > 编程 > C++ > 正文

C++程序员面试中常被问到的问题(持续更新)

2019-11-06 06:09:42
字体:
来源:转载
供稿:网友

C/C++程序占用的内存

栈区— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。堆区 — 一般由程序员分配释放, 若程序员不释放,例如malloc、free,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后有系统释放文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 程序代码区—存放函数体的二进制代码。

指针和引用的区别

指针是地址,引用是别名可以有const指针,但是没有const引用; 指针可以有多级 指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化; 指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。“sizeof(&ref)”得到的是所指向的变量(对象)的大小,而”sizeof(*ptr)”得到的是指针本身的大小;

空类的大小及默认的方法

一个空类默认大小为1,如果有虚函数,因为虚函数表与指针的存在,所以在32位机器上,一个类的大小为4。

class EmptyCppClass{ public: EmptyCppClass(); // 缺省构造函数 EmptyCppClass( const EmptyCppClass& ); // 拷贝构造函数 ~EmptyCppClass(); // 析构函数 EmptyCppClass& Operator=( const EmptyCppClass& ); // 赋值运算符 EmptyCppClass* operator&(); // 取址运算符 const EmptyCppClass* operator&() const; // 取址运算符 const};

4. 宏与内联函数的区别

内联函数在运行时可调试,而宏定义不可以;编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;内联函数可以访问类的成员变量,宏定义则不能;在类中声明同时定义的成员函数,自动转化为内联函数。

内联函数的优缺点

优点:提升运行效率,缺点:使二进制文件变得很大。

内联函数是否能为虚函数

不可以: - 虚函数肯定不会被内联这一点毋庸置疑,因为虚函数只有到了runtime才能被识别到底是哪一个被调用,而内联是编译器就会将代码展开并安插,这个明显不是一回事。 - inline有两种表现方式,一种就是一inline在实现文件中(.cpp)指出,这个被称为显示内联,另外一种将函数声明和定义放入同一个文件,这种称为隐式内联,但是还是如前面所说,inline只是一个提示符,至于会不会内联还是由编译器说了算。

虚函数与纯虚函数的区别

虚函数一个Virtual就够了,但是纯虚函数还得=0做标识,另外,纯虚函数在子类中必须实现,虚函数没这个说法。

C++中的explicit关键字

C++四种转换类型,与传统转换比较的优缺点

static_cast 最常用的类型转换符,在正常状况下的类型转换,如把int转换为float,如:int i;float f; f=(float)i;或者f=static_cast<float>(i);const_cast 用于取出const属性,把const类型的指针变为非const类型的指针,如:const int *fun(int x,int y){}  int *ptr=const_cast<int *>(fun(2.3))dynamic_cast 该操作符用于运行时检查该转换是否类型安全,但只在多态类型时合法,即该类至少具有一个虚拟方法。dynamic_cast与static_cast具有相同的基本语法,dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。reinterPRet_cast interpret是解释的意思,reinterpret即为重新解释,此标识符的意思即为数据的二进制形式重新解释,但是不改变其值。如:int i; char *ptr="hello freind!"; i=reinterpret_cast<int>(ptr);这个转换方式很少使用。

函数指针与指针函数

指针函数 先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。int *f(int a, int b); 函数指针 函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象。函数指针的定义如下:int (*f)(int a, int b); // 声明函数指针

什么是复制构造函数(深拷贝与浅拷贝)

const int p与int const p和const int const *p区别

const int *p; // const修饰的是*p,因此*p是常量不能改变,但可以改变p的指向;int const* p;// 同上,主要是看const与*的前后关系;int* const p; // const修饰的是p,因此p的指向是常量不能改变,但*p可以改变;const int const *p; // 两个const既修饰了*p也修饰了p,因此*p与p都是常量不能改变;

C++ 11种的新特征

继承类中的虚函数

malloc, new, free, delete的区别

malloc, free是操作符,只能对内置类型进行分配,new,delete是函数,可以对自定义类型进行内存分配,new的调用会调用构造函数,malloc则没有。

类与结构体的区别

类成员默认为private,struct默认为public;

C++类能有它自身类型的对象吗?

C++类可以有自身类型的对象,但是不是简单的直接定义对象,它可以定义静态的自身类型对象或者是自身类型的指针。

析构函数是否可以为虚函数,默认的呢?

析构函数可以为虚函数,而且应该标为虚函数,这是为了防止析构函数在析构父类的时候没有析构子类,这样会造成内存泄漏。而默认的析构函数不是虚函数。

构造函数是否可以为虚函数?

构造函数绝对不能为虚函数,因为构造函数的调用必须要确定构造出的类,这个是在编译器决定的,虚函数是在运行时决定的,所以不可以。

写一个不可继承的类

参考这里:http://zhedahht.blog.163.com/blog/static/25411174200793181548842/

拷贝构造函数可以私有吗?

当然可以私有,只不过private以后就不能再进行拷贝了。

为什么拷贝构造函数的参数是引用?

这是为了防止循环调用构造函数,造成死循环。

啥时候需要重写默认的复制构造函数?

一般来说不需要重写复制构造函数,除非默认的复制构造函数提供的浅拷贝不能满足需求了才重写。

啥时候调用复制构造函数?

类数据成员的初始化

类数据成员的初始化只要记住初始化顺序跟定义顺序是一致的就可以了。

析构函数可以私有吗?

可以是可以,但是得需要重写一个类似于析构函数的函数,只有这样才能正常地释放对象。

为什么复制构造函数参数是const

这个已经涉及到了C++03的标准,它规定赋值的左值是const,所以右值也应该是const。

静态对象何时被销毁?

因为静态周期生命周期要比其他对象要长,所以静态对象一定是在函数结束的最后被销毁的。

虚函数可以是静态的吗?

不可以,虚函数必须有对象操作,静态的话就跟对象没关系了,就这一点就矛盾了,所以虚函数不能为static。

迭代器循环中++iter与iter++有什么区别?


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选