c++什么是问题,

从C转换到C时,需注意C+的关键字要比C來的多 int class=2;/*在C中是正确的,在C++中则有语法错误米/ int virtual3;/*在C中是正确的,在C+中则有语法错误* 除了一些象上面所举的例」外(《TheC++ Programming language》(第三版)的附录B中详细列出了标 C++與C的这类区别)C++是C的一个超集(附录B可以从网上卜载) 6.C++与C有什么区别? C+是C的直接后裔,几乎将C当作一个子集而差不多保留了C的全部内容,C++提供了更强的類型检查 杋制并直接支持范围更广的编程风格.在这神意义上说C艹是"吏好的C",它支持C语言的编程风袼并有史好 的类型检查(又不失其原有的高效率).类似的, ANSI C是比K&RC更好的C,另外C+支持数据抽象,面向对 象的编程和类编程(请见《TheC++ rogramming I. anguage》(第3版),可以从网上下载的附录B中讨论了 兼容性什么是问题. 我还未曾見过哪一个程序用C表达比用C++米得更好(我认为不存在这样一个C程序,其结构与C++完全 等价) 然而,在某些情况下由于C++得不到充分的支持,而使用C夏有利. 偠理解有关(+的设计以及C++与C的关系的一些讨论,请见《 The Design and Evolution of(++》 7.为什么用C+产生的“ Hello World”的程序代码要比用C产生的长十倍? 在我的机器上不会有这种现象,在伱的机器上也不会有.实际上,在我的机器“he1 lo world”程序的C+ 版本的目标代码比C要小.没有语言方面的原因使得一种版本的稈序代码比另一种的要长.只囿一种情况, 那就是实现一和语言的人是如何组织标准厍的.如果一种版木要比另一版木大得多,则要向大的一方的实现 者提出所发现的什么是問题 8.什么是面向对象的程序设计(OOP)? 面向对象的设计方法是一种进行程序设计的新方法,它吸取了结枃化程序设计的先进思想,为解决程 序结构过於复杂而产生它的思想是在进行程序设计时,把整个什么是问题分成由相关部分组成的组,每个组考 虑和组相关的代码和数据,同时这些分组將按层次关系组织起来,每个分组转换为对象的独立单元。面向 对象的程序设计语言都具有多态性、继承性、封裝性等特点 9.通常的C++程序包括哪几部分 C艹是面向对象的程序设计语言,所以C→+程序和C程序在风格上有很大不同用户编写的C艹程序通 常分为.cpp和.h两类,,h文件中通常是类的定义,函数原型或说明以及数据的声明等,然后在.cpp文什 中通过包含(# include).h文件来使用。—个C艹+程序的结构通常是:在程序首部是预处理指令,可以声 明需要用箌的类库或者包含自定义的函数或类的.h文件,定义常量、宏等等程序的主函数是main()函 数,程序将从这里开始执行。 10.什么是类型转换? 当类型不同嘚变量出现在冋一表达八屮或者赋值符号两边时,会导致类型转换转换的原则是赋值号 右边的值将被转换成赋值号左边变量的类型,然后赋給左边的变量,同一表达式中的不同类型都将转换成 与最人类型操作数相同的类型,即从低位字向高位字转换(如int转为 float)。有时类型转换会造成数 據的丢失也可以冇变量前加(type)来强制使变量转换为需要的类型。比如说某个 float类型的变量在 输出时需要输岀浮点数的信息,而同时它也作为计數值在控制循环次数((int) varname) 11.何时执行构造函数和析构函数? 晑部对象的构迨函数在遇到对象说明语句时执行,并按遇到对象的顺序依次遞用,其析构函数则按构 造函数的反序进行执行。仝局对象的构造函数在main()开始之前执行,并在同一文件中按书写顺序依次 执行,但是几个文件之间的全局对潒的构造函数执行顺序是不可知的,其析构函数在函数main()结束之 后按构造函数反序执行 如何创建数组 数组可以动态创建也可以静态创建。当巳知数组大小时,可以简单的定义为 int array[10]动态创 建数组时数组大小可以是已知的,也可以是变元,此时用动态分配符new来创建,定义形式为type carray= new type[size],当然用完数組时必须用 deleted array来释放空间,由于动态创数组是分配 ∫一块內存空间,因此当数组较大时最好静态分配。对丁多维数组,静态分配同前,动态分配则从朂高维 开始依次用new分配,释放时则从低维到高维依次 delete[] 13.C++会自动检查数组越界吗? 回答是否定的,也就是说当你的数组越界使用时编译程序不会报錯,而只能是在执行时产生非法操作 者得不到正确结果。因此在使用数组时一定要在编程时自己判断是否越界以保证程序的正确性 14.指针和数組有什么关系? 指针和数组之间是有密切的关系的当创建一个数组后,虽然没有定义,但是数组名即是一个指向该 数组第一个元素的指针,同样乜可以用这个指针对数组进行操作。例如定义数组 int array[10];int*p; p=aray;执行后p即指向了数组的第一个元素 array[0],最后一个语句相当于p=& array[0](很少这么用) 而任何一个指针变量都可以以数组的方式使用,即通过指针加下标米改变指针的指向。例如定义指针变量 intp:则有p[1]==米(p+) 15.指针使用中应注意哪些什么是问题? 指针虽然功能强大,使用灵活,但是很多时候它会导致致命的并且不容易发现的错误因此使用指针 时一定要特别小心,注意不要犯以下错误:首先,未经初始囮的指针使用起来是很危险的,因为它可能指 向某个未知的内存空间,这样对它操作可能导致严重的后果。解决方法是在使用指针前一定要初始化它的 指向(有时nul1中是不安全的)其次,对指针的错误理解也可能得不到正确结果甚至产生错误,如数组 越界等。另外在使用 delete时也容易产玍指針错误,deleτe前一定要确认被释放的指钅指向的是有效地 址,例如在释放数组时如果忘记了∏将只释放数组的第一个元紊所占的空间,而其佘元素將被程序″遗忘″ 在死区,而且很可能当时未被发现,但是如果程序过大或者多次执行将导攽资源不足而使系统崩溃总之 由于指针是对内存嘚直接操作,所以稍不注意就可能产生错误。只有彻底了解指针的使用,并且在编程过 稈中时刻注意检查指针的拦向,指针才会成为有力的工具 16.向函数传递参数有几种方法?有什么不同? 向函数传递的参数可以是传值参数,也可以是引用参数,还可能是指针。传值时形式参数即简单的写 荿 type varname,函数执行后将不改变实参的值引用传递是把变元的地址传给函数,形式参数写成type & varname,调用时则直接写实参的名字即可,因此函数执行后对实参 varname嘚修改将被保留。指针传递 就是把变量的指针传给参数,形参形式为typε* varname,显然函数将对指针指向的内存地址直接搡作, 修改将被休留 17.什么是类? 類是面向对象程序设计的基础。一个类定义了一种数据类型,有一点儿像C语言中的结构类型( struc t) 从计算机科学的观点来说,一种数据类型应该包括一系列的犬态和一系列的操作,操作引起状态的转化。 18.什么是对象? 在声明一个整型变量时,我们会说:"inti;",这时我们的意思是,"i是整数类型的一个对潒"在 面向对象的C++程序设计中,对象意味着类的实例。 19.什么是友元? 友元是C++为某个类提供的允许其它类或者函数访问它的机制友元可以是函數,也可以是类。一个 类可以给予它的友元存取和访问自己的特权 20.友元违反数据封装原则吗? 恰当地应用友元,不但不会破坏封装性,反而会加強它 冇编程的时候,我们经常遇到这样的情况,就是两个类之间有着紧密的联系,它们常常需要互相访问 对方的数括和成员函数。实现这种编杩嘚最好方法,就是将这两个类互相设置成友元 这样做的好处是,我们可以使两个类屮的私有成员保持它的私有性。有些初级编程者为了避免使用友 元,常常将数据设置成 public的,或者利用 public的get()和set()对私有成员进行存取,这样徹实 际上反而破坏了数据的封装性采用get()和set()这种存取函数的机制,与直接设置公有数据取得的 效果,几乎一样差。它们只是将私有数据成员的名字隐藏了起来,而私有数据成员其他的一切,都暴露出 来 同样,将一些函數设置成友元也不会影响类的封装特性友元函数和类的成员函数一起,构成了类的 封裝边界。换句诟说,友元函数对于封装带来的影响,就妇哃成员函数的影响一样谁会说成员函数影响 了类的封装性呢? 21.构造函数是用米做什么的? 构造函数从尘土中建造大楼″。构造函数完成对象嘚初始化工作,它们将一堆毫无意义的比特转化成 个个活生生的对象它们为对象初始化各种数据,并分配各种资源,包括内存、文件、 socket等等。 析构函数用来释放对象所占有的所有资源,包括内存、文件、 socket连接等等它的工作一般和构造 数的初始化工作相对。最常见的例子就是构造函数用new,而析构函数用 delete 24.编写析构函数时,需要显式调用成员对象的析构函数吗? 不需要 类的析构函数自动用成员对象的析构函数 25.编写派生类的析枸函数时,需要显式调用基类的析构函数吗? 不需要 派生类的析构函数自动调用基类的析构函数 26.结构和类有什么区别? C++扩展了C中的结构,使结构吔可以定义类。唯一的区是, class定义的类中的缺省访问级别是 private,而 struct定义中缺省级别为 public 27.联合与类有什么区别? 联合也可以用来定义关,与结构类似其缺省访问级别是 public。如果要求创建的对象的元素共亨同 內存地址时就用 union来定义该类但是使用联合定义类时有以下限制:联合不能继承其他的類,也不能 被继承,不能含有虚成员函数,不能有静态成员变量,不能有重载运算符"=的对象作成员,不能有含有构 造函数和析构函数的对象作成员。 28.哪些运算符可以被重线?哪些不能? 大部分运算符都可以被亘载,个能被重载的运算符有 和 29.如何进行文件操作? 要处理文件I/O,程序首部必须包含头文件 filename为文件名,mode值为文件打开方式, access 值为存取文件方式实际上常常不调用函数open()而直接用 ifstream或 ofstream的构造函数来打开文 件。要关闭一个文件,就用该文件關联的流调用成员函数 close()即可 31.如何读写一个文件? 读写文本文仵时只需将与文件相关联的流与运算符<、》连用即可但是这样读写文本时将发苼某些 成员函数eof()可以跟踪何时到达文件尾,当到达文件尾时eof()返回值不为0,否则为0. 33.new和 delete比ma1loc和free有哪些优点? new和 delete完成与 malloc和free相似的功能,仨是它们相比之下有鉯下优点 i.用new自动分配空间时容量是自动计算的,不必使用 sizeof运算符,所以能够分配到足够的空间 以容纳指定类型的对象,避免发生错误。 用new分配内存后将自动返回指定对象类型的指针,而用 malloc则需显式的使用强制类型转换 ii.new和 delete都可以重载,而 malloc和free不存在此功能。 34.C++中可以使用 printf()和 scanf()吗? scanf相比它们具有洳卜优点:安全,编译器会静态地事先得知变量类型而不是由% 动态获得;简单快還,不易岀错;而通过重载运算符<和〉>,可以对用户定义的对象直接进荇输入输岀操 作,这是 printf和 scanf所不能及的 35.C艹中的输出εout<<能够指定输出数据的域宽和精度吗? 可以通过设置格式标志来完成,另外流类ios还有三个成员函數来设置格式参数它们分别是: int width(intw);//设置域宽,w为新域宽,返冋以前的域宽, nt precision(intp);//设置精度,p为设置的凊度,返回原来的精度值。 char fill( char ch);//设置填充宁符,ch为新的填充字苻,返回原来的值 它们都可以由cout调用 36.如何向函数传递数组? 对于传递的一维数组,形式参数可以写成指针、有界数组、无界数组种方式,例如 yoid fun(int*x) 或鍺 void fun(intx[10])或者 void fun(intx[])。这三种方法效果相同,在调用时实参均应该是指 向数组的指针传递多维数组时,除第一维外其余各维大小必须指定,如 void fun(intx「「21「61) 37.我如何財能防止其他的程序员看到我的类的私有成员从而维扩数据封装性呢? 这个什么是问题本身就存在什么是问题。封装针对的是编码,而不是程序员 其他程序员看到你编写的类的私有成员,并不意味着这个类的封装性被破坏了,只要这些程序员不依 赖于他们所看到的私有成员编与他們的程序,那么你的类的封装性就没有受到仼何影响。〃私有″这个词是 针对类而言的,不是针对你和其他程序员 38.封装是一种安全机制吗 不是 封装并不笔于安全。封装是用来防止错误发生的,封装不能用※防间谍 9.可以向构造函数传递变元吗? 可以通过向构造函数传递变元,可以对對象进行特定的初始化。 40.如何向函数传递对象? 传递对象参缴可以和传递其他类型的参数使用相同的方法对象可以通过传值方式传递给函數,也就 是传递给了函数一个拷贝。由于是相当于创建了一个新对象,那么它的构造函数和析构函数是否要执行呢? 结果是这样的:新对象没有执荇构造函数,但是函数结束时执行了析构函数原因是新对象应该保持原对 象的状态,因此不能执行构造函数重新初始化,而是执行拷贝构造函數,而最后这个拷贝还是要被撤销的, 所以要执行析构函数。当然,如果希望对象能够被函数改变也可以向函数传递对象的引用或者指针 41.为什么伖元关系不具有传递性,也不能通过继承得到? 很明显,这么做是合情合理的拿生活中的朋友关系类比:我宣称你是我的朋友,但这并不代表我也 認为你的儿女或者你的朋友也是我的朋友。 对于你朋友的儿女,你不一定信任,这说明朋友关系不能继承如果 class c声明clε ss Base是一个 友元类,并且 class derived是 class basc的派生类, 这是不可能办到的。如果你调用了另一个构造函数,编译器将创建一个临时局部对象,而对于当前的 对象起不到任何初始化作用如果想要两个构造凼数共亨代码,可以创建一个私有成员函数 initial( 在两个构造函数中分别调用它即可。 43.对于类C米说,缺省构造函数一定是C::C()的形式吗? 不是這样的 缺省构造函数是这样一类构造函数:调用它时可以不给出任何参数所以不带任何参数的构造函数当 然是缺省构造函数,比如 class C(;//缺省构造函数 但是,缺省构造函数乜可以带有参数,只要这些参数都具有缺省值即可,比如 class c C(inte=0,intb=0);//缺省构造函数 44.为什么含有静态成员的类产生链接错误? 你必须在某个文件中定义Fred 否则链接不能通过,比如在Fred.cpp文件中定义它 / Fred cpp #inc lude fred, h int Fred∷:j=0 45.局部对象的析构顺序是怎样的 局部对象按照它们建立顺序的反顺序进行析构。最早创建的对象最晩被析构 在下面的例子中,b的析构函数首先被调用,然后是a的析构函数。 void fo c b 46.能够重载类的析构函数吗? 不能 对于一个类来讲,只能有一个析构函数,也一定是c1 ass name:: class name(的形式。析构函数没 有任何参数,也没有返回值我们不能传递给析构函数什么参数,因为我们不能显式的调用析構函数。 47.如果我的对象是通过new创建的,那么我可以显式的调用析构凶数清除这个对象吗? 不能 你必须通过 delete来清除这个对象。 delete操作自动调用相應的析构函数,但是它比析构数多做 ∫一件亘娈的事情,它释放∫对象本身占有的内存需要铭记在心的是: delete徹∫两件事情,它调用了 析构函数,并苴释放了对象占用的内存。 48.说明指针变量和引用变量时,*或&应该与类型名连在一起运是变量名连在一起? 当定义啪个变量时这种做法是一样的,呮是反映了不同的风格而已,可以认为与类型名连在一起时 得到一种指针类型但是实际上并非如此,当多个变量冋时定义时也许会出现什么昰问题,如int*a,b:将会 定义—个指针类型变量a和一个整型变量b。因此只要清楚真正的含义,在实际应用时可以灵活一些而不 会出错 49.如何进行操作符偅载? 操作符重载是十分有用的,特别是在面向对象的程序设计中,可以对自定义的对象直接用操作符连接, 增强了直观性,例如重载加号+使它完成兩个复数(用户定义的类)的加法。进行操作符重载时需要用到关 键字 operator,为某个类的对象重载操作符的成员函数定义形式为: returnt ype operator#(para-list); 其中 returntype是操作后返回的數据类型,通常是参与计算的对象的类型,#代表被重载的操作符,当# 是单目操作符时参数表为空,当#为双目操作符时参数表中将是右澡作数也就昰说是操作符左边的对象调 用的函数。也可以用 friend来重载关J类的运算符,这时函数将个是类的成员(没有this指针)这样 重载函数将显式的传递操作數,所以重毂单目操作符将有一个参数,而重载双目操作符将有两个参数。但 是不能用 friend重载=,(),>运算符,而且参数需要是引用类型, 50.在函数定义中使用 const修饰符有何作用 关键字 const可以说明常量,但是在函数定义中有更大的作用当函数的参数是指针或者引用变量时 (非传值参数),如果前血加修饰符 cons t,則可以避免被指向或被引用的变量。当成员函数被 const修 饰时,例如 void fun() const;则表示该函数不会对调用它的对象产生影响 51.派生类可以继承基类的哪些部汾? 基类中的所有声明为 public和 protected的成员,派生类都可以继承,但是声明为 private的部分 派生类则无权继承,这是为了将米基类中的(私有)成员一且修改不会影响箌其派生类。 52. public, protected, private有什么区别? 它们都是类成员的汸问级别, public标注的成员具有公有级别,也就是其他函数或者类的对象都可 问它: private表示私有成员,它们不能被本类以外的对象或者函数引用: protec ted修饰的成员是保护 成员,除了本类或本类的派生类可以存取外共他都无权访问 53.为什么要使用模板? 有些操作對不同数捱类型的数据操作相同,但是不得不对各个数据类型分别编写代码为了让程序更 加简洁通用,用 template关键字将不同类型数据的共同操作萣义成模板,以后某个类型的数据需要进行这 个操作时就可以只指定数据类型以后直接调用该模板。可以编写模板函数,也可以编写模板类(可鉯棖据 不同的数据类型生成不同的对象),定义时只需在前面加上 template< class t>,T表小程序中待定的数 据类型模板函缴在调用时无需显式指定数据类型,直接調用即可;模板类调用时需在程序中需要指定数 据类型的尖括号内给出具体的数据类型(如int)。

}

c++中的结构体只是为了兼容c而保留

嘚在C++里完全可以使用类来代替结构体。在类中使

构体实际就是内部类的什么是问题把结构体看成一个没有成员函数的类。  就是一個可以包含不同数据类型的一个结构它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同首先结构体可以在一个结构Φ声明不同的数据类型。第二相同结构的结构体变量是可以相互赋值的,而数组是做不到的因为数组是单一数据类型的数据集合,它夲身不是数据类型(而结构体是)数组名称是常量指针,所以不可以做为左值进行运算所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同  结构指针通过->符号来访问成员,下面我们就以上所说的看一个完整的例子:  C++代码  //程序莋者:管宁  //所有稿件均有版权,如要转载,请务必注明出处和作者  #include  #include  usingnamespacestd;  structtest//定义一个名为test的结构体  {  inta;//定义结构体成员a  intb;//定義结构体成员b  };  voidmain()  {  testpn1;//定义结构体变量pn1  testpn2;//定义结构体变量pn2  pn2.a=10;//通过成员操作符.给结构体变量pn2中的成员a赋值  pn2.b=3;//通过成员操作符.給结构体变量pn2中的成员b赋值  pn1=pn2;//把pn2中所有的成员值复制给具有相同结构的结构体变量pn1  cout

}

我要回帖

更多关于 c++中::什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信