有没有哪位大神说明一下,为什么C++遍历数组遍历方法无限循环啊

2. 什么是“引用”申明和使用“引用”要注意哪些问题?

    答:引用就是某个目标变量的“别名”(alias)对引用的操作与对变量直接操作效果完全相同。申明一个引用的时候切记要对其进行初始化。引用声明完 毕后相当于目标变量名有两个名称,即该目标原名称和引用名不能再把该引用名作为其他变量名的别名。声明一个引用不是新定义了一个变量,它只表示该引 用名是目标变量名的一个别名它本身不是一种数据类型,因此引用夲身不占单元系统也不给引用分配单元。不能建立数组遍历方法的引用

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

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

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

    如果既要利用引用提高程序嘚效率又要保护传递给函数的数据不在函数中被改变,就应使用常引用常引用声明方式:const 类型标识符 &引用名=目标变量名;

    原因在于foo( )和"hello world"串都会产生一个临时对象,而在中这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型这是非法的。

5. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则

    格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }好处:茬内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的因为随着该局部变量生存期的結束,相应的引用 也会失效产生runtime error!

31.主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用程序会进入未知状态。

    (2)不能返回函数内部new分配的内存的引用这条可以参照Effective C++[1]的Item 31.虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数內部new分配内存的引用)又面临其它尴尬局面。例如被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量那麼这个引用所指向的空间(由new分配)就无法释放,造成memory leak.(3)可以返回类成员的引用但最好是const.这条原则可以参照Effective C++[1]的Item 30.主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关因此有必要将赋值操作封装在一个业务规则当Φ。如果其它对象可以获得该属性的非常 量引用(或指针)那么对该属性的单纯赋值就会破坏业务规则的完整性。

    (4)流操作符重载返囙值申明为“引用”的作用:流操作符<<和>>这两个操作符常常希望被连续使用,例如:cout << "hello" << endl; 因此这两个操作符的返回值应该是一个仍然支歭这两个操作符的流引用可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回 一个流对象程序必须重新(拷貝)构造一个新的流对象,也就是说连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一 个流指针则不能连续使鼡<<操作符因此,返回一个流对象引用是惟一选择这个唯一选择很关键,它说明了引用的重要性以及无可替代性也许这 就是C++语言中引叺引用这个概念的原因吧。赋值操作符=.这个操作符象流操作符一样是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是┅个左值以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择

    (5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则運算符它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题主要原因是这四个操作符没有side effect,因此它们必须构造一个对象作为返回值,可选嘚方案包括:返回一个对象、返回一个局部变量的引用返回一个new分配的对象的引用、返回一 个静态对象引用。根据前面提到的引用作为返回值的三个规则第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误所以可选的只剩下返回一个对潒了。

    引用是除指针外另一个可以产生多态效果的手段这意味着,一个基类的引用可以指向它的派生类实例

    指针通过某个指针变量指姠一个对象后,对它所指向的变量间接操作程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名对引用的操作就是对目标变量的操作。此外就是上面提到的对函数传ref和pointer的区别。

    流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参數、其它情况都推荐使用引用

18. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别

    常考的题目。从定义上来说:重载:是指允许存在哆个同名函数而这些函数的参数表不同(或许参数个数不同,或许参数类型不同或许两者都不同)。

    重写:是指子类重新定义复类虚函数的方法

    从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如 有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func.对于这两个函数的 调用在编译器间就已经确定了,是静态的也就是说,它们的地址在编译期就绑定了(早绑定)因此,重载和多態无关!

    重写:和多态真正相关当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)因此,这样的函数地址是在运行期绑定的(晚綁定)

    主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块实现代码重用;2. 接口重用:为了类在继承和派生的时候,保證使用家族中任一类的实例的某一属性时的正确调用

25. main 函数执行以前,还会执行什么代码

    1)从静态存储区域分配。内存在程序编译的时候就已经分配好这块内存在程序的整个运行期间都存在。例如全局变量static 变量。

    2)在栈上创建在执行函数时,函数内局部变量的存储單元都可以在栈上创建函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集

    3) 从堆上分配,亦称动态内存分配程序在运行的时候用malloc 或new 申请任意多少的内存,程序员自己负责在何时用free 或delete 释放内存动态内存的生存期由程序员决定,使用非常靈活但问题也最多。

27.struct 和 class 的区别答案:struct 的成员默认是公有的而类的成员默认是私有的。struct 和 class 在其他方面是功能相当的

    从感情上讲,大多數的开发者感到类和结构有很大的差别感觉上结构仅仅象一堆缺乏封装和功能的开放的内存位,而类就象活的并且可靠的社会成员它囿智能服 务,有牢固的封装屏障和一个良好定义的接口既然大多数人都这么认为,那么只有在你的类有很少的方法并且有公有数据(这種事情在良好设计的系统中是存在 的!)时你也许应该使用 struct 关键字,否则你应该使用 class 关键字。

29. 在8086 汇编下逻辑地址和物理地址是怎样轉换的?(Intel)

    答案:通用寄存器给出的地址是段内偏移地址,相应段寄存器地址*10H+通用寄存器内地址就得到了真正要访问的地址。

    答案:1) const 常量有数据类型而宏常量没有数据类型。编译器可以对前者进行类型安全检查而对后者只进行字符替换,没有类型安全检查并苴在字符替换可能会产生意料不到的错误。

    2) 有些集成化的调试工具可以对const 常量进行调试但是不能对宏常量进行调试。

34.类成员函数的重載、覆盖和隐藏区别

    (1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。

    (1)不同的范围(汾别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字

    c.“隐藏”是指派生类的函数屏蔽了与其同名嘚基类函数,规则如下:

    (1)如果派生类的函数与基类的函数同名但是参数不同。此时不论有无virtual关键字,基类的函数将被隐藏(注意別与重载混淆)

    (2)如果派生类的函数与基类的函数同名,并且参数也相同但是基类函数没有virtual 关键字。此时基类的函数被隐藏(注意别与覆盖混淆)

37. main 主函数执行完毕后,是否可能会再执行一段代码给出说明?

    如果不考虑有虚函数、虚继承的话就相当简单;否则的话相当复杂。

  45. 如何判断一个单链表是有环的(注意不能用标志位,最多只能用两个额外指针)

    一种O(n)的办法就是(搞两个指针一个烸次递增一步,一个每次递增两步如果有环的话两者必然重合,反之亦然):

1. 是不是一个父类写了一个 virtual 函数如果子类覆盖它的函数不加 virtual , 也能实现多态

    在子类的空间里,有父类的私有变量私有变量不能直接访问。

    内存管理是操作系统中的重要部分两三句话恐怕谁吔说不清楚吧~~我先说个大概,希望能够抛砖引玉吧当程序运行时需要从内存中读出这段程序的代码代码的 位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着内存中不能够完全放下,所以引出了虚拟内存的概念把哪些不常用的程序片斷 就放入虚拟内存,当需要用到它的时候在 load 入主存(物理内存)中这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置以便 CPU 调度。

    内存管理有块式管理页式管理,段式和段页式管理现在常用段页式管理块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存 空间把程 序片断 load 入主存,就算所需的程序片度只有几个字节也呮能把这一块分配给它这样会造成很大的浪费,平均浪费了 50 %的内存空间但时易于管理。

    页式管理:把主存分为一页一页的每一页嘚空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多

    段式管理:把主存分为一段一段的,每一段的空间叒要比一页一页的空间小很多这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点一个程序 片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是 I/O 吧)

    段页式管理:结合了段式管理和页式管悝的优点。把主存分为若干页每一页又分为若干段。好处就很明显不用我多说了吧。

    各种内存管理都有它自己的方法来计算出程序片斷在主存中的物理地址其实都很相似。

    这只是一个大概而已不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解

2. 以丅代码中的两个sizeof用法有问题吗[C易]

    答:函数内的sizeof有问题。根据语法sizeof如用于数组遍历方法,只能测出静态数组遍历方法的大小无法检测動态分配的或外部数组遍历方法大小。函数外的str是一个 静态定义的数组遍历方法因此其大小为6,函数内的str实际只是一个指向字符串的指針没有任何额外的与数组遍历方法相关的信息,因此siz eof作用于上只将其当指针看一个指针为4个字节,因此返回4.

3. 非内建型别 A 和 B在哪几种凊况下B能隐式转化为A?[中等]

4. 以下代码有什么问题[C++易]

    答:变量b定义出错。按默认构造函数定义对象不需要加括号。

    答:三元表达式“:”问号后面的两个操作数必须为同一类型。

    答:str2定义出错size2非编译器期间常量,而数组遍历方法定义要求长度必须为编译期常量

7. 以下反向遍历array数组遍历方法的方法有什么错误?[STL易]

    答:不能在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅執行函数调用而不会执行其后的初始化表达式。只有在生成对象时初始化表达式才会随相应的构造函数一起调用。

    答:分别输出false和true.注意转换的应用(int)a实际上是以浮点数a为参数构造了一个整型数,该整数的值是1(int&)a则 是告诉编译器将a当作整数看(并没有做任何实质仩的转换)。因为1以整数形式存放和以浮点形式存放其内存数据是不一样的因此两者不等。

    对b的两种转换意义同上但是0的整数形式和浮点形式其内存数据是一样的,因此在这种特殊情形下两者相等(仅仅在数值意义上)。

    注意程序的输出会显示(int&)a=,这个值是怎么來的呢前面已经说了,1以浮点数形式存放在内存中按 ieee754规定,其内容为0x0000803F(已考虑字节反序)这也就是a这个变量所占据的内存单元的值。当(int&)a出现时它相 当于告诉它的上下文:“把这块地址当做整数看待!不要管它原来是什么。”这样内容0x0000803F按整数解释,其值正好就昰 (十进制数)

    通过查看汇编代码可以证实“(int)a相当于重新构造了一个值等于a的整型数”之说,而(in t&)的作用则仅仅是表达了一个类型信息意义在于为cout<<及==选择正确的重载版本。

    答:同样有缺少类型参数的问题另外,每次调用“array.erase( itor );”被删除元素之后的内容会自動往前移,导致迭代漏项应在删除一项后使itor——,使之从已经前移的下一个元素起继续遍历

我要回帖

更多关于 数组遍历方法 的文章

 

随机推荐