码迷,mamicode.com
首页 > 编程语言 > 详细

c++面试

时间:2017-08-21 23:03:54      阅读:385      评论:0      收藏:0      [点我收藏+]

标签:lis   重复   c++   targe   编译   c语言   ring   load   faq   

 Bjarne Stroustrup 的 C++ 风格与技术 FAQ(中文版)

1、尽可能说出static关键字的作用?

  (1) static修饰函数局部变量(包括main函数里的),该变量不会随着函数作用域的退出而销毁,而是只分配一次内存,下次调用时为上次调用的值。

  (2) static修饰全局变量,限定了该变量只能被本文件访问,不能被其他文件访问。

  (3) static修饰的函数只能被本文件访问,不能被其他文件访问。

  (4) static menber属于类,所有该类的实例对象共享一份拷贝(此处是名词)

  (5) static menber function不接受this指针,只能访问静态成员

       由此衍生出问题:静态变量和静态成员函数的用法?

2、尽可能说出const的用法?

const不能简单的只认为是 “常数”,c语言中要使用常数,比如PI,会用define,<<effective c++>>推荐使用const,因为使用宏如果编译报错,是不会显示PI的,只提示3.1415数字。const的真正用意是为了提醒程序员,该对象是不可修改的

  (1) 用const修饰一个变量,需要初始化,忘记初始化会编译报错

  (2) const与指针作用时,<<c++ primer 5th>> 分为pointer to const(指向常量的指针,指针自以为指向的是常量,不能用指针来修改对象,而不要求该对象是    const的),const pointer(指针不能指向其他对象),或者const int * const p =&a; 

  (3) const 修饰形参,表明不能通过形参修改实参,可以接收const对象作为实参或non-const对象

  (4) const引用,不能用引用去修改所引对象,但对象本身可以是可修改的, 引用本身不能再指向其他对象

  (5) const修饰成员函数,则该函数不能修改成员变量,但是如果变量是指针,用指针可以修改所指的资源(见effctive c++ item 03);const men fun是可以      重载的,如const T &operator[]() const 、T&operator[]();前者可以被const T类型的对象调用,后者不能,因为const对象会把this指针转换为const 指针

  (6) const修饰函数范围类型,这样就不会有a*b=c(假设重载了*)这样诡异的合法代码。

1 const classA operator*(const classA& a1,const classA& a2);  
2 operator*的返回结果必须是一个const对象。如果不是,这样的变态代码也不会编译出错:  
3 classA a, b, c;  
4 (a * b) = c; // 对a*b的结果赋值 

 (7) const 与define的优点

ps:const mem fun隐含有一个const *this参数,static mem fun隐含没有this指针,所以两者一起修饰成员函数是不能通过编译的

3、引用与指针的区别?为什么不用string *const p 代替string &p

首先说明为什么引入引用? 

因为加入引用是为了支持operator overloading。这里有一个假设,如果没有引用,那么,用指针来operator overloading操作。A operator +(const A *a, const A *_a); 那么使用的时候,&a + &b,这样看起来是不是很难受。使用指针可读性差,*p。

而引入引用的概念,既可以满足overload operator,也不失重载value和pointer的灵活性。而且引用还带来一个指针无法替代的特性: 引用临时对象。因为引用必须在定义的时候就赋值,以后无法更改。string &s=string();

  (1) 引用必须被初始化,没有void 引用,编译时引用必须与某个对象bind,引用不是对象,只是别名,引用本身不分配内存。

  (2) 不能有string & const s,可以有const string&s ,后者为常量引用。

  (3) 解引用操作是对指针,获取指针所指对象,不是对引用操作

  (4) sizeof(引用)得到bind对象的大小,sizeof(pointer)得到指针本身的大小

  (5) 作为函数形参,如果实参是指针,用实参初始化形参,是传址(本质上也是传值)——>可能需要指针类型转换,或派生类指针传给基类指针;如果是传引用,传递的是对象本               身,不需要要额外的复制开销。如果需要修改指针,可以用二级指针

4、将“引用”作为函数参数有哪些特点?

  (1) 传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对相应         的目标对象(在主调函数)的操作。

  (2) 使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是          实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好

  (3) 使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且         程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

看了一些C++面经,有基础问题如const的几种作用、虚函数的实现机制、熟悉shared_ptr吗、这些是C++的语言特性部分,如果要考察STL,我目前只直到vector、list,对各种算法其他容器不熟悉,更不用说容器的时间效率与空间开销;如果要考察算法,链表和二叉树、快速排序、堆排序,这又可以结合make_head() 等堆函数;如果是要考察代码实现,如memcpy、strstr、strcmp等。所以我需要牢固掌握C++的基础知识,STL,再就是刷题,掌握各种常考的算法,这些才是我能达到的优势项,linux、项目等不是我短期能擅长的地方。

c++面试

标签:lis   重复   c++   targe   编译   c语言   ring   load   faq   

原文地址:http://www.cnblogs.com/hchacha/p/7407039.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!