【语言】C++面试题汇总

参考:

http://www.100mian.com/mianshi/ibm/4753.html

 

1. C++ 比C的优势主要在哪些地方?

C++语言继承了C语言的优点和市场优势,扩充增加了对开发大型软件颇为有效的方面向对象机制,弥补了C语言不支持代码重用、不适宜开发大型软件的不足,成为一种既可用于表现过程模型,又可用于表现对象模型的当前最富魅力的程序设计语言。

2. inline 函数的特点是什么?

优点:

  • 1)inline定义的内联函数,函数代码被放入符号表中,在使用时进行替换(像宏一样展开),效率很高。
  • 2)类的内联函数也是函数。编绎器在调用一个内联函数,首先会检查参数问题,保证调用正确,像对待真正函数一样,消除了隐患及局限性。
  • 3)inline可以作为类的成员函数,刀可以使用所在类的保护成员及私有成员。

缺点:

内联函数以复制为代价,活动产函数开销

  • 1)如果函数的代码较长,使用内联将消耗过多内存
  • 2)如果函数体内有循环,那么执行函数代码时间比调用开销大。

3. inline & 宏的不同之处是什么?

区别如下:

  • 1)内联在编绎时展开,宏在预编译时展开。
  • 2)编译内联函数可以嵌入到目标代码,宏只是简单文本替换。
  • 3)内联会做类型,语法检查,而宏不具这样功能。
  • 4)宏不是函数,inline函数是函数
  • 5)宏定义小心处理宏参数(一般参数要括号起来),否则易出现二义性,而内联定义不会出现。

4. 什么叫做抽象?

抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。

5)引用和指针有什么区别,指针怎么实现引用的用法?

引用不是一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。引用一经确定就不能修改。
指针是一个变量,需要在内存中分配空间,此空间中存储所指对象的地址。由于指针是一个普通变量,所以其值还可以通过重新赋值来改变。
把指针定义为const后,其值就不能改变了,功能和引用类似,但有本质的区别。

6)C++:指针传递、引用传递的区别

传递指针,那么会先复制该指针,在函数内部使用的是复制后的指针,这个指针与原来的指针指向相同的地址,如果在函数内部将复制后的指针指向了另外的新的对象,那么不会影响原有的指针;

传递指针引用,如果将传递进来的指针指向了新的对象,那么原始的指针也就指向了新的对象,这样就会造成内存泄漏,因为原来指针指向的地方已经不能再 引用了,即使没有将传递进来的指针指向新的对象,而是在函数结束的时候释放了指针,那么在函数外部就不能再使用原有的指针了,因为原来的内存已经被释放了

无论你传值还是传指针,函数都会生成一个临时变量, 但传引用时,不会生成临时变量, 当你传值时,只可以引用值而不可以改变值,但传值引用时,可以改变值, 当你传指针时,只可以改变指针所指的内容,不可以改变指针本身,但传指针引用时,即可以改变指针所指的内容,又可以改变指针本身,但传引用主要是它不生成临时变量,不进行返回值copy等,速度快。

7)指针和引用的区别

.指针和引用的定义和性质区别:

(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:

int a=1;int *p=&a;

int a=1;int &b=a;

上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址。

而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一个存储单元。

(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)

(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;

(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了。

(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;

(7)指针和引用的自增(++)运算意义不一样;

2.指针和引用作为函数参数进行传递时的区别。

(1)指针作为参数进行传递:用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。解引用。

1.c++中引用和指针有什么不同?指针加上什么限制等于引用?   
引用是在变量表中增加该变量的别名,不占用内存空间,一经确定不能修改。但指针要在内存中分配空间。把指针定义为const可做引用使用,但有本质的区别。
首先,要认识到在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就可以把变量声明为引用。
因为引用肯定会指向一个对象,在c++里,引用应被初始化。指针没有这样的限制。
不存在指向空值的引用这个事实意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。
指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。
总的来说,在以下情况下你应该使用指针,一是你考虑到存在不指向任何对象的可能(在这种情况下,你能够设置指针为空),二是你需要能够在不同的时刻指向不同的对象(在这种情况下,你能改变指针的指向)。如果总是指向一个对象并且一旦指向一个对象后就不会改变指向,那么你应该使用引用。
还有一种情况,就是当你重载某个操作符时,你应该使用引用。最普通的例子是操作符[]。这个操作符典型的用法是返回一个目标对象,其能被赋值。
2.怎样用最快的方法判断链表是否有环? 
定义两个指针,一前一后,同时移动,前面的移动比后面的慢,如果是循环的则后面的肯定会追上前面的
bool anycircleinlist(lnode* phead)
{
   if(phead == null phead->next == null) //无节点或只有一个节点并且无自环
      return (false);

   if(phead->next == phead) //自环
      return (true);

   lnode *ptemp1 = phead; //step 1

   lnode *ptemp = phead->next; //step 2

   while(ptemp != ptemp1 && ptemp != null && ptemp->next!= null)
   {
      ptemp1 = ptemp1->next;
      ptemp = ptemp->next->next;
   }
   if(ptemp == ptemp1)
      return (true);
return (false);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值