⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter5.htm

📁 为清华大学出版社 C++课后答案
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>




<style type="text/css">
<!--
.style1 {
	font-family: "宋体";
	font-size: 16px;
	color: #FF0000;
	font-weight: bold;
	font-style: italic;
}
.style2 {
	font-family: "宋体";
	font-size: 14px;
}
.style3 {font-size: 14px}
-->
</style>
</head>

<body>
<p><span 
      class=style1>第 五 章 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C++程序的基本结构</span><br>
</p>
<p><b><span class=style2>5-1 什么叫做作用域?有哪几种类型的作用域?</span></b><span class=style2style2 style3><br>
</span></p>
<p class="style2"><span class=style2>解: <br>
  作用域讨论的是标识符的有效范围,作用域是一个标识符在程序正文中有效的区域。C++的作用域分为函数原形作用域、块作用域(局部作用域)、类作用域和文件作用域.<br>
</span></p>
<p class="style2"><span class=style2><b>5-2 什么叫做可见性?可见性的一般规则是什么?</b><br>
</span></p>
<p class="style2"><span class=style2>解: <br>
  可见性是标识符是否可以引用的问题;<br>
  可见性的一般规则是:标识符要声明在前,引用在后,在同一作用域中,不能声明同名的标识符。对于在不同的作用域声明的标识符,遵循的原则是:若有两个或多个具有包含关系的作用域,外层声明的标识符如果在内层没有声明同名标识符时仍可见,如果内层声明了同名标识符则外层标识符不可见。 <br>
</span></p>
<p class="style2"><span class=style2><b>5-3 下面的程序的运行结果是什么,实际运行一下,看看与你的设想有何不同。</b><br>
  #include &lt;iostream.h&gt;<br>
  void myFunction(); </span></p>
<p class=style2>int x = 5, y = 7; <br>
  int main()<br>
  {</p>
<p class=style2>cout &lt;&lt; "x from main: " &lt;&lt; x &lt;&lt; "\n";<br>
  cout &lt;&lt; "y from main: " &lt;&lt; y &lt;&lt; "\n\n";<br>
  myFunction();<br>
  cout &lt;&lt; "Back from myFunction!\n\n";<br>
  cout &lt;&lt; "x from main: " &lt;&lt; x &lt;&lt; "\n";<br>
  cout &lt;&lt; "y from main: " &lt;&lt; y &lt;&lt; "\n";<br>
  return 0;<br>
  }<br>
  void myFunction()<br>
  {<br>
  int y = 10;</p>
<p class=style2>cout &lt;&lt; "x from myFunction: " &lt;&lt; x &lt;&lt; "\n";<br>
  cout &lt;&lt; "y from myFunction: " &lt;&lt; y &lt;&lt; "\n\n";<br>
  }<br>
</p>
<p class=style2>解: <br>
  程序运行输出:<br>
  x from main: 5<br>
  y from main: 7</p>
<p class=style2>x from myFunction: 5<br>
  y from myFunction: 10</p>
<p class=style2>Back from myFunction!</p>
<p class=style2>x from main: 5<br>
  y from main: 7<br>
</p>
<p class=style2>&nbsp;</p>
<p class=style2><b>5-4 假设有两个无关系的类Engine和Fuel,使用时,怎样允许Fuel成员访问Engine中的私有和保护的成员?</b><br>
</p>
<p class=style2>解: <br>
  源程序:<br>
  class fuel;<br>
  class engine<br>
  {<br>
  friend class fuel;<br>
  private;<br>
  int powerlevel;<br>
  public;<br>
  engine(){ powerLevel = 0;}<br>
  void engine_fn(fuel &amp;f);<br>
  };<br>
  class fuel<br>
  {<br>
  friend class engine;<br>
  private;<br>
  int fuelLevel;<br>
  public:<br>
  fuel(){ fuelLevel = 0;}<br>
  void fuel_fn( engine &amp;e);<br>
  };</p>
<p class=style2>&nbsp;</p>
<p class=style2><b>5-5 什么叫做静态数据成员?它有何特点?</b><br>
</p>
<p class=style2>解: <br>
  类的静态数据成员是类的数据成员的一种特例,采用static关键字来声明。对于类的普通数据成员,每一个类的对象都拥有一个拷贝,就是说每个对象的同名数据成员可以分别存储不同的数值,这也是保证对象拥有自身区别于其它对象的特征的需要,但是静态数据成员,每个类只要一个拷贝,由所有该类的对象共同维护和使用,这个共同维护、使用也就实现了同一类的不同对象之间的数据共享。<br>
</p>
<p class=style2><b>5-6 什么叫做静态函数成员?它有何特点?</b><br>
</p>
<p class=style2>解: <br>
  使用static关键字声明的函数成员是静态的,静态函数成员属于整个类,同一个类的所有对象共同维护,为这些对象所共享。静态函数成员具有以下两个方面的好处,一是由于静态成员函数只能直接访问同一个类的静态数据成员,可以保证不会对该类的其余数据成员造成负面影响;二是同一个类只维护一个静态函数成员的拷贝,节约了系统的开销,提高程序的运行效率。<br>
</p>
<p class=style2><b>5-7 定义一个Cat类,拥有静态数据成员HowManyCats,记录Cat的个体数目;静态成员函数GetHowMany(),存取HowManyCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。</b><br>
</p>
<p class=style2>解: <br>
  源程序:<br>
  #include &lt;iostream.h&gt;</p>
<p class=style2>class Cat<br>
  {<br>
  public:<br>
  Cat(int age):itsAge(age){HowManyCats++; }<br>
  virtual ~Cat() { HowManyCats--; }<br>
  virtual int GetAge() { return itsAge; }<br>
  virtual void SetAge(int age) { itsAge = age; }<br>
  static int GetHowMany() { return HowManyCats; }<br>
  private:<br>
  int itsAge;<br>
  static int HowManyCats;<br>
  };</p>
<p class=style2>int Cat::HowManyCats = 0;</p>
<p class=style2>void TelepathicFunction();</p>
<p class=style2>int main()<br>
  {<br>
  const int MaxCats = 5;<br>
  Cat *CatHouse[MaxCats]; int i;<br>
  for (i = 0; i&lt;MaxCats; i++)<br>
  {<br>
  CatHouse[i] = new Cat(i);<br>
  TelepathicFunction();<br>
  }</p>
<p class=style2>for ( i = 0; i&lt;MaxCats; i++)<br>
  {<br>
  delete CatHouse[i];<br>
  TelepathicFunction();<br>
  }<br>
  return 0;<br>
  }</p>
<p class=style2>void TelepathicFunction()<br>
  {<br>
  cout &lt;&lt; "There are " &lt;&lt; Cat::GetHowMany() &lt;&lt; " cats alive!\n";<br>
  }</p>
<p class=style2>程序运行输出:<br>
  There are 1 cats alive!<br>
  There are 2 cats alive!<br>
  There are 3 cats alive!<br>
  There are 4 cats alive!<br>
  There are 5 cats alive!<br>
  There are 4 cats alive!<br>
  There are 3 cats alive!<br>
  There are 2 cats alive!<br>
  There are 1 cats alive!<br>
  There are 0 cats alive!<br>
</p>
<p class=style2><b>5-8 什么叫做友元函数?什么叫做友元类?</b><br>
</p>
<p class=style2>解: <br>
  友元函数是使用friend关键字声明的函数,它可以访问相应类的保护成员和私有成员。友元类是使用friend关键字声明的类,它的所有成员函数都是相应类的友元函数。</p>
<p class=style2>&nbsp;</p>
<p class=style2><b>5-9 如果类A是类B的友元,类B是类C的友元,类D是类A的派生类,那么类B是类A的友元吗?类C是类A的友元吗?类D是类B的友元吗?</b><br>
</p>
<p class=style2>解: <br>
  类B不是类A的友元,友元关系不具有交换性;<br>
  类C不是类A的友元,友元关系不具有传递性;<br>
  类D不是类B的友元,友元关系不能被继承。<br>
</p>
<p class=style2><b>5-10 静态成员变量可以为私有的吗?声明一个私有的静态整型成员变量。</b><br>
</p>
<p class=style2>解: <br>
  可以,例如:<br>
  private:<br>
  static int a;<br>
</p>
<p class=style2><b>5-11 在一个文件中定义一个全局变量n,主函数main(),在另一个文件中定义函数fn1(),在main()中对n赋值,再调用fn1(),在fn1()中也对n赋值,显示n最后的值。</b><br>
</p>
<p class=style2>解: <br>
  #include &lt;iostream.h&gt;<br>
  #include "fn1.h"</p>
<p class=style2>int n;</p>
<p class=style2>void main()<br>
  {<br>
  n = 20;<br>
  fn1();<br>
  cout &lt;&lt; "n的值为" &lt;&lt;n;<br>
  }</p>
<p class=style2>// fn1.h文件 <br>
  extern int n; </p>
<p class=style2>void fn1()<br>
  {<br>
  n=30;<br>
  }</p>
<p class=style2>程序运行输出:<br>
  n的值为30<br>
</p>
<p class=style2><b>5-12 在函数fn1()中定义一个静态变量n,fn1()中对n的值加1,在主函数中,调用fn1()十次,显示n的值。</b><br>
</p>
<p class=style2>解: <br>
  #include &lt;iostream.h&gt;</p>
<p class=style2>void fn1()<br>
  {<br>
  static int n = 0;<br>
  n++;<br>
  cout &lt;&lt; "n的值为" &lt;&lt; n &lt;&lt;endl;<br>
  }</p>
<p class=style2>void main()<br>
  {<br>
  for(int i = 0; i &lt; 10; i++)<br>
  fn1();<br>
  }</p>
<p class=style2>程序运行输出:<br>
  n的值为1<br>
  n的值为2<br>
  n的值为3<br>
  n的值为4<br>
  n的值为5<br>
  n的值为6<br>
  n的值为7<br>
  n的值为8<br>
  n的值为9<br>
  n的值为10<br>
</p>
<p class=style2><b>5-13 定义类X、Y、Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5,函数h(X*)是X的友元函数,实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。<br>
</b></p>
<p class=style2>解: <br>
  #include "my_x_y_z.h"<br>
  void main() <br>
  {<br>
  X x;<br>
  Z z;<br>
  z.f(&amp;x);<br>
  }</p>
<p class=style2>// my_x_y_z.h文件<br>
  #ifndef MY_X_Y_Z_H</p>
<p class=style2>class X; <br>
  class Y {<br>
  void g(X*);<br>
  };</p>
<p class=style2>class X <br>
  { <br>
  private:<br>
  int i;<br>
  public:<br>
  X(){i=0;}<br>
  friend void h(X*);<br>
  friend void Y::g(X*);<br>
  friend class Z;<br>
  };</p>
<p class=style2>void h(X* x) { x-&gt;i =+10; }</p>
<p class=style2>void Y::g(X* x) { x-&gt;i ++; }</p>
<p class=style2>class Z {<br>
  public:<br>
  void f(X* x) { x-&gt;i += 5; }<br>
  };</p>
<p class=style2>#endif // MY_X_Y_Z_H</p>
<p class=style2>程序运行输出:无<br>
</p>
<p class=style2><b>5-14 定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。</b><br>
</p>
<p class=style2>解: <br>
  源程序:<br>
  #include &lt;iostream.h&gt;</p>
<p class=style2>class Boat;<br>
  class Car<br>
  {<br>
  private:<br>
  int weight;<br>
  public:<br>
  Car(int j){weight = j;}<br>
  friend int totalWeight(Car &amp;aCar, Boat &amp;aBoat);<br>
  };</p>
<p class=style2>class Boat<br>
  {<br>
  private:<br>
  int weight;<br>
  public:<br>
  Boat(int j){weight = j;}<br>
  friend int totalWeight(Car &amp;aCar, Boat &amp;aBoat);<br>
  };</p>
<p class=style2>int totalWeight(Car &amp;aCar, Boat &amp;aBoat)<br>
  {<br>
  return aCar.weight + aBoat.weight;<br>
  }</p>
<p class=style2>void main()<br>
  {<br>
  Car c1(4);<br>
  Boat b1(5);</p>
<p class=style2>cout &lt;&lt; totalWeight(c1, b1) &lt;&lt; endl;<br>
  }<br>
  程序运行输出:<br>
  9<br>
</p>
<p class=style2><b>5-15 如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生多少个相应的静态变量?</b><br>
</p>
<p class=style2>解: <br>
  这个类模板的每一个实例类都会产生一个相应的静态变量。</p>
<p class="style2"></p>
<p class="style2"></p>
<p class="style2">&nbsp;</p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -