C++面试

1.C和C++中struct有什么区别?

1> C++中的struct类似于class,有变量,有构造函数、虚函数等,有继承,多态等类的特征;

2> C中的struct只有变量,不能有函数,但是可以有函数指针


2.C++中的struct和class有什么区别?

在C++中,两者区别不大,但是有2个主要的区别

1>. 继承权限:struct默认是public继承;class默认是private继承

2>. 访问权限:struct默认是public访问;class默认是private访问


3.如何判断一段程序是由C 编译程序还是由C++编译程序编译的?  

【标准答案】  

#ifdef __cplusplus

cout<<“c++";

#else

cout<<"c";

#endif

4. C和C++有什么不同? 

【参考答案】

从机制上: 

c是面向过程的(但c也可以编写面向对象的程序);

c++是面向对象的,提供了类。但是,c++编写面向对象的程序比c容易。  

从适用的方向: c适合要求代码体积小的,效率高的场合,如嵌入式; c++适合更上层的,复杂的; llinux核心大部分是c写的,因为它是系统软件,效率要求极高。

从名称上也可以看出,c++比c多了+,说明c++是c的超集;那为什么不叫c+而叫c++呢,是因为c++比 c来说扩充的东西太多了,所以就在c后面放上两个+;于是就成了c++。  

C语言是结构化编程语言,C++是面向对象编程语言。 C++侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。

关于这个问题,个人觉得《Effective C++》上面第一条说的很好,

View C++ as a federation of languages. 把C++当做一个语言联邦。

C++由四部分组成

1> C语言部分;

2> 面向对象部分,包括封装、继承、多态这些C语言所没有的特性;

3> 泛型编程部分,大多数类、函数要考虑到把它设计成模板,方便复用;

4> STL库,里面封装了大量的优秀模板,是 3> 中内容的集成, 学会使用它们可以让代码更高效。当然,最好去深入了解STL源码,那样会对C++有更深的理解。


5.“引用”与指针的区别是什么?
   【参考答案】

指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。

程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

另一本C++著作《More Effective C++》里,第一条就是论述 point 和 reference的区别

总结一下 ,

1> 指针是一个存储地址的变量,而引用是一个变量的别名。所以在一个函数中,传引用要比传指针速度更快。

2> 指针可以指向一个空值,而引用必须初始化。指针可以如下形式出现

int *p;
是合法但不合理的(相当于是一个野指针)。

可以声明一个指向空值的指针

int *p=null
而引用不行
int &r;
是错误的

引用必须初始化为一个变量的别名,如

  1. int a= 5;
  2. int &r=a;

3> 也是因为 2>的特性,指针在使用前要判断是否为空,而引用必定不为空(否则会报错),所以不用判断。

4> 指针可以更改指向的内存地址,而引用是和变量绑定的,不可更改。

5> 在运算符重载过程中,通常返回一个引用往往比返回一个指针更好,使用指针易引起语义上的歧义。



6.

class A

{

virtual void func1();  

void func2();

} ;

class B: class A 

{

void func1()

{

cout < < "fun1 in class B" < < endl;

}  

             virtual void func2()

            {

                           cout < < "fun2 in class B" < < endl;

            }

A, A中的func1和B中的func2都是虚函数
B, A中的func1和B中的func2都不是虚函数.

C, A中的func2是虚函数.,B中的func1不是虚函数.

D, A中的func2不是虚函数,B中的func1是虚函数. 

【标准答案】A



7.int id[sizeof(unsigned long)];这个对吗?为什么?

【标准答案】

正确

这个 sizeof是编译时运算符,编译时就确定了 可以看成和机器有关的常量。


8.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 ()?
A.只限某个函数 B.本文件    C.跨文件 D.不限制作用域

【参考答案】B。静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

在《C和指针》上看过,static关键字会改变具有外部链接性的变量和函数


9.C++函数中值的传递方式有哪几种?

【标准答案】

C++函数的三种传递方式为:值传递、指针传递和引用传递。

(指针传递就是通常说的地址传递)


10.对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?

【标准答案】c用宏定义,c++用inline

define实现的函数功能容易出bug,所以在c++中最好不要使用

11.引用与指针有什么区别?
【参考答案】  
1) 引用必须被初始化,指针不必。
2) 引用初始化以后不能被改变,指针可以改变所指的对象。 
3) 不存在指向空值的引用,但是存在指向空值的指针。

12.C++中virtual与inline的含义分别是什么?
【参考答案】
在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。
inline与函数的定义体放在一起,使该函数称为内联。
inline是一种用于实现的关键字,而不是用于声明的关键字。 
虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。 
内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。


13.
VC中,编译工具条内的Debug与Release选项是什么含义?
【参考答案】
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug带有大量的调试代码,运行时需要相应的运行库,
发布模式程序紧凑不含有调试代码和信息,直接可以运行(如果不需要运行库)

14.函数assert的用法?
【参考答案】断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段
学VC++的时候见过assert宏定义,但是自己从来没用过。。。

15.const  与 #define 的比较 ,const有什么优点?
【参考答案】
(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。 
#define不能生成 类的专属常量,因为它只是进行简单的替换。。
(2)  有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。
《Effective C++》中建议以const、enum、inline代替#define。
使用enum的原因
有些情况下,编译器不允许静态常量出现在类的初始设定中,只得以enum的形式
另一方面,enum和#define更相似,它们都没有具体的类型,比如,有const int a; 却没有 #define N int a,enum和#define都不能够被去地址,而const可以。

16.请你谈谈引用和指针的区别。
【参考答案】
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。 
(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL) 。 
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 。

17.
有了 malloc/free 为什么还要 new/delete  ?
【参考答案】
malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。
 对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。 
因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。


18.如果在申请动态内存时找不到足够大的内存块,malloc 和 new 将返回 NULL 指针,宣告内存申请失败。你是怎么处理内存耗尽的?
【参考答案】
(1)判断指针是否为 NULL,如果是则马上用 return 语句终止本函数。
(2)判断指针是否为 NULL,如果是则马上用 exit(1)终止整个程序的运行 
(3)为 new 和 malloc 设置异常处理函数。例如 Visual C++可以用_set_new_hander 函数为 new 设置用户自己定义的异常处理函数,也可以让 malloc 享用与 new 相同的异常处理函数。

19.C++是不是类型安全的?
【参考答案】不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。


20. const 符号常量;
(1)const char *p 
(2)char const *p (
3)char * const p 
说明上面三种描述的区别;
【参考答案】
(1)p是一个指向const char的指针,p是可以改变指向的,但是p指向的值是不能改变的;        
(2)p指向的恰好是一个指向const的char的普通指针;
(3)p是一个指针,这个指针是指向char的const指针。        
(1)和(2)的定义是一样的。

1、2和3的区别在于,1和2的const出现在*号左边,3出现在*号右边。好像也是在《C和指针》上看到的这句话。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本方法。编译原理不仅是计算机科学理论的重要组成部分,也是实现高效、可靠的计算机程序设计的关键。本文将对编译原理的基本概念、发展历程、主要内容和实际应用进行详细介绍编译原理是计算机专业的一门核心课程,旨在介绍编译程序构造的一般原理和基本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值