程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++習題與解析-引用

C++習題與解析-引用

編輯:C++入門知識

  01.分析以下程序的執行結果
  #include<iostream.h>
  void main()
  {
  int a;
  int &b=a; // 變量引用
  b=10;
  cout<<"a="<<a<<endl;
  }
  解:
  本題說明變量引用的方法。b是a的引用,它們分配相同的空間,b的值即為a的值。
  所以輸出為 a=10。
  
  注重:引用是引入了變量或對明的一個 義詞,引用不產生對象的副本。 ----------------------------------------------------------------- 02.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int x;
  public:
  Sample(){};
  Sample(int a){x=a;}
  Sample(Sample &a){x=a.x+1;}
  void disp(){cout<<"x="<<x<<endl;}
  };
  void main()
  {
  Sample s1(2),s2(s1);
  s2.disp();
  }
  解:
  本題說明類拷貝構造函數的使用方法。Sample類的Sample(Sample &a)構造函數是一個拷貝構造函數,將a對象的x值賦給當前對象的x後加1。
  所以輸出為:x=3。
  
  -----------------------------------------------------
  
  03.編寫程序,調用傳遞引用的參數,實現兩個字符串變量的交換。
  例如開始:
  char *ap="hello";
  char *bp="how are you?";
  交換的結果使得ap和bp指向的內容分別為:
  ap: "how are you?"
  bp: "hello"
  解:
  本題使用引用調用(實現由於字符串指針本身就是地址,這裡可不使用引用參數,效果是一樣的)。
  程序如下:
  #include<iostream.h>
  #include<string.h>
  void swap(char *&x,char *&y) // 引用作為參數
  {
  char *temp;
  temp=x;x=y;y=temp;
  }
  void main()
  {
  char *ap="hello";
  char *bp="how are you?";
  cout<<"ap:"<<ap<<endl;
  cout<<"bp:"<<bp<<endl;
  swap(ap,bp);
  cout<<"swap ap,bp"<<endl;
  cout<<"ap:"<<ap<<endl;
  cout<<"bp:"<<bp<<endl;
  }
  本程序的執行結果如下:
  ap:hello
  bp:hoe are you?
  swap ap,bp
  ap:how are you?
  bp:hello
  
  -----------------------------------------------------
  
  04.設計一個集合類Set,包括將集合置空、添加元素、判定元素是否在集合中、輸出集合,以及將集合中元素逆置,另外還有一個拷貝構造函數,並使用一些數據進行測試。
  解:
  Set類包括私有數據成員elems(存放集合元素)、pc(當前元素指針),一個默認構造函數和拷貝構造函數Set(Set &s),另有成員函數empty()(將集合置空)、isempty()(判定集合是否為空)、ismemberof()(判定元素是否在集合中)、add()(添加元素)、print()(輸出集合)、reverse(將集合中元素置逆)。
  本題程序如下:
  #include<iostream.h>
  #define Max 100
  class Set
  {
  public:
  Set(){pc=0;}
  Set(Set &s); // 對象引用作為參數
  void empty(){pc=0;}
  int isempty(){return pc==0;}
  int ismemberof(int n);
  int add(int n);
  void print();
  void reverse();
  private:
  int elems[Max];
  int pc;
  };
  int Set::ismemberof(int n)
  {
  for(int i=0;i<pc;i++)
  if(elems[i]==n)
  return 1;
  return 0;
  }
  int Set::add(int n)
  {
  if(ismemberof(n))
  return 1;
  else if(pc>Max)
  return 0;
  else
  {
  elems[pc++]=n;
  return 1;
  }
  }
  Set::Set(Set &p)
  {
  pc=p.pc;
  for(int i=0;i<pc;i++)
  elems[i]=p.elems[i];
  }
  void Set::print()
  {
  cout<<"{";
  for(int i=0;i<pc-1;i++)
  cout<<elems[i]<<",";
  if(pc>0)
  cout<<elems[pc-1];
  cout<<"}"<<endl;
  }
  void Set::reverse()
  {
  int n=pc/2;
  for(int i=0;i<n;i++)
  {
  int temp;
  temp=elems[i];
  elems[i]=elems[pc-i-1];
  elems[pc-i-1]=temp;
  }
  }
  void main()
  {
  Set A;
  cout<<"A是否為空:"; cout<<A.isempty()<<endl;
  cout<<"A:"; A.print();
  Set B;
  for(int i=1;i<=8;i++)
  B.add(i);
  cout<<"B:"; B.print();
  cout<<"5是否在B中:"; cout<<B.ismemberof(5)<<endl;
  B.empty();
  for(int j=11;j<20;j++)
  B.add(j);
  Set C(B);
  cout<<"C:"; C.print();
  C.reverse();
  cout<<"C逆置"<<endl;
  cout<<"C:"; C.print();
  }
  本程序執行結果如下:
  A是否為空:1
  A:{}
  B:{1,2,3,4,5,6,7,8}
  5是否在B中:1
  C:{11,12,13,14,15,16,17,18,19}
  C逆置
  C:{19,18,17,16,15,14,13,12,11}
  
   05.設計一個類Sample,實現兩個復數的乘法運算。
  解:
  Sample類包括復數的實部和虛部,以及實現復數相乘的成員函數mult()和輸出復數的成員函數disp()。
  本題的程序如下:
  #include<iostream.h>
  class Sample
  {
  float a; // 實部
  float b; // 虛部
  public:
  Sample(){}
  Sample(float x,float y){a=x;b=y;}
  void mult(Sample &s) // 對象引用作為參數
  {
  if(&s==this) // 不能自己相乘
  cout<<"自己不能相乘"<<endl;
  else
  {
  float x=a*s.a-b*s.b;
  float y=a*s.b+b*s.a;
  a=x;b=y;
  }
  }
  void disp()
  {
  if(b>0)
  cout<<a<<"+"<<b<<"i"<<endl;
  else
  cout<<a<<"-"<<-b<<"i"<<endl;
  }
  };
  void main()
  {
  Sample s1(2,3),s2(3,4);
  cout<<"復數s1:"; s1.disp();
  cout<<"復數s2:"; s2.disp();
  s1.mult(s2);
  cout<<"相乘結果:"; s1.disp();
  cout<<endl;
  }
  本程序執行結果如下:
  復數s1:2+3i
  復數s2:3+4i
  相乘結果:-6+17i
  
  ------------------------------------------------------
  
  06.有若干教師,每個教師只有姓名,一個教師可以指導多名研究生;每名研究生有姓名、研究方向和班號數據,編寫一個程序,要求輸出每個教師指導的所有研究生的姓名、研究方向和班號數據。
  解:
  先設計一個學生類student,然後設計一個教師類teacher。teacher類中添加一個student對象數組,存放該教師指導的所有研究生對象,top為當前研究生的指針。這樣實現了兩個類之間一對多的關系。
  本題程序如下:
  #include<iostream.h>
  #include<string.h>
  #define Max 10
  class student
  {
  char name[10]; // 姓名
  char search[20]; // 研究方向
  char cname[10]; // 班號
  public:
  student(){}
  student(char n[],char s[],char c[])
  {
  strcpy(name,n);
  strcpy(search,s);
  strcpy(cname,c);
  }
  char *getname(){return name;}
  char *getsearch(){return search;}
  char *getcname(){return cname;}
  };
  class teacher
  {
  int top;
  char name[10];
  student stud[Max]; // 對象數組
  public:
  teacher(char t[]){top=0;strcpy(name,t);}
  void add(student &s) // 對象引用作為參數
  {
  stud[top]=s; top++;
  }
  void disp()
  {
  cout<<"指導教師:"<<name<<endl<<" 研究生:"<<endl;
  for(int i=0;i<top;i++)
  {
  cout<<""<<stud[i].getname()<<"("<<"方向:"<<stud[i].getsearch()<<","
  <<stud[i].getcname()<<"班)"<<endl;
  }
  }
  };
  void main()
  {
  teacher t[]={teacher("李明"),teacher("王華")};
  student s1("孫強","數據庫","99010");
  student s2("陳文","軟件工程","99010");
  student s3("章銳","計算機網絡","00010");
  t[0].add(s1);
  t[0].add(s2);
  t[1].add(s3);
  for(int i=0;i<2;i++)
  t[i].disp();
  }
  本程序的執行結果如下:
  指導教師:李明
  研究生:
  孫強(方向:數據庫,99010班)
  陳文(方向:軟件工程,99010班)
  指導教師:王華
  研究生:
  章銳(方向:計算機網絡,00010班)
   題1.分析以下程序的執行結果
  #include<iostream.h>
  void swap(int &x,int &y)
  {
  int temp;
  temp=x; x=y; y=temp;
  }
  void main()
  {
  int x=10,y=20;
  swap(x,y);
  cout<<"x="<<x<<",y="<<y<<endl;
  }
  解:
  這裡的函數采用引用調用的方式,所以輸出為:x=20,y=10
  注重:在函數調用裡,引用調用與傳址調用的效果相同,但更加簡潔直觀。
  
  ----------------------------------------------------------
  
  題2.分析以下程序的執行結果
  #include<iostream.h>
  void main()
  {
  int a[]={10,20,30,40},*pa=a;
  int *&pb=pa;
  pb++;
  cout<<*pa<<endl;
  }
  解:
  pa為數組的指針,首先指向a[0],pb是pa的引用,當執行pb++時,也使pa指向了a[1],所以輸出為:20
  
  -------------------------------------------------------------
  
  題3.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int x;
  public:
  Sample(){};
  Sample(int a){x=a;}
  Sample(Sample &a){x=a.x++ +10;}
  void disp(){cout<<"x="<<x<<endl;}
  };
  void main()
  {
  Sample s1(2),s2(s1);
  s1.disp();
  s2.disp();
  }
  解:
  Sample類的Sample(Sample &a)構造函數是一個拷貝構造函數,將a對象的x增1然後加上10後賦給當前對象的x,由於a是引用對象,所以輸出為:
  x=3 // ++運算的結果
  x=12 // 2+10
  
  --------------------------------------------------------------
  
  題4.分析以下程序的執行結果
  #include<iostream.h>
  class Sample
  {
  int x,y;
  public:
  Sample(){x=y=0;}
  Sample(int i,int j){x=i;y=j;}
  void copy(Sample &s);
  void setxy(int i,int j){x=i;y=j;}
  void print(){cout<<"x="<<x<<",y="<<y<<endl;}
  };
  void Sample::copy(Sample &s)
  {
  x=s.x;y=s.y;
  }
  void func(Sample s1,Sample &s2)
  {
  s1.setxy(10,20);
  s2.setxy(30,40);
  }
  void main()
  {
  Sample p(1,2),q;
  q.copy(p);
  func(p,q);
  p.print();
  q.print();
  }
  解:
  本題說明對象引用作為函數參數的作用。Sample類中的copy()成員函數進行對象拷貝。在main()中先建立對象p和q,p與q對象的x,y值相同,調用func()函數,由於第2個參數為引用類型,故實參發生改變;而第1個參數不是引用類型,實參不發生改變。所以輸出為:
  x=1,y=2
  x=30,y=40
  
  -------------------------------------------------------
  
  題5.設計一個Book類,包含圖書的書名、作者、月銷售量等數據成員,其中書名和作者采用字符型指針,另有兩個構造函數、一個析構函數和兩個成員函數setbook()和print(),其中setbook()用於設置數據,print()用於輸出數據,其說明如下:
  void print(ostream& output)
  即引用輸出流。
  解:
  依題意,本題程序如下:
  #include<iostream.h>
  #include<string.h>
  class Book
  {
  char *title; // 書名
  char *author; // 作者
  int numsold; // 月銷售量
  public:
  Book(){}
  Book(const char *str1,const char *str2,const int num)
  {
  int len=strlen(str1);
  title=new char[len+1];
  strcpy(title,str1);
  len=strlen(str2);
  author=new char[len+1];
  strcpy(author,str2);
  numsold=num;
  }
  void setbook(const char *str1,const char *str2,const int num)
  {
  int len=strlen(str1);
  title=new char[len+1];
  strcpy(title,str1);
  len=strlen(str2);
  author=new char[len+1];
  strcpy(author,str2);
  numsold=num;
  }
  ~Book()
  {
  delete title;
  delete author;
  }
  void print(ostream& output) // 輸出流引用作為參數
  {
  output<<"輸出數據"<<endl;
  output<<" 書名:"<<title<<endl;
  output<<" 作者:"<<author<<endl;
  output<<" 月銷售量:"<<numsold<<endl;
  }
  };
  void main()
  {
  Book obj1("C語言程序設計","譚浩強",800),obj2;
  obj1.print(cout);
  obj2.setbook("C++語言程序設計","李春葆",300);
  obj2.print(cout);
  }
  本程序的執行結果如下:
  輸出數據
  書名:C語言程序設計
  作者:譚浩強
  月銷售量:800
  輸出數據
  書名:C++語言程序設計
  作者:李春葆
  月銷售量:300
  
   題6.閱讀下面的程序與輸出結果,添加一個拷貝構造函數來完善整個程序
  #include<iostream.h>
  class Cat
  {
  public:
  Cat();
  Cat(const Cat &);
  ~Cat();
  int getage()const{return *itsage;}
  void setage(int age){*itsage=age;}
  protected:
  int *itsage;
  };
  Cat::Cat()
  {
  itsage=new int;
  *itsage=5;
  }
  Cat::~Cat()
  {
  delete itsage;
  itsage=0;
  }
  void main()
  {
  Cat frisky;
  cout<<"frisky's age:"<<frisky.getage()<<endl;
  cout<<"setting frisky to 6... ";
  frisky.setage(6);
  cout<<"creating boots from frisky ";
  Cat boots(frisky);
  cout<<"frisky's age:"<<frisky.getage()<<endl;
  cout<<"boots'age:"<<boots.getage()<<endl;
  cout<<"setting frisky to 7... ";
  frisky.setage(7);
  cout<<"frisky's age:"<<frisky.getage()<<endl;
  cout<<"boots'age:"<<boots.getage()<<endl;
  }
  
  當添加了拷貝構造函數後,程序的運行結果為:
  frisky's age:5
  setting frisky to 6...
  creating boots from frisky
  frisky's age:6
  boots'age:6
  setting frisky to 7...
  frisky's age:7
  boots'age:6
  
  解:
  添加的拷貝構造函數如下:
  Cat::Cat(const Cat& c)
  {
  itsage=new int;
  *itsage=*c.itsage;
  }
  
  -----------------------------------------------
  
  題7.設計一個類Sample,有一個私有數據成員,建立該類的四個對象s1(n=10)、s2(n=20)、s3(n=30)、和s4(n=40),建立一個成員函數實現這些對象n值的累加。
  解:
  依題意,建立一個成員函數add(),其參數為Sample對象引用,用於累加對象n值。
  程序如下:
  #include<iostream.h>
  class Sample
  {
  int n;
  public:
  Sample(){}
  Sample (int i){n=i;}
  void add(Sample &s) // 對象引用作為參數
  {
  if(&s==this) // 不能自己相加,this是當前對象的指針
  cout<<"自己不能相加"<<endl;
  else n+=s.n;
  }
  void disp(){ cout<<endl<<" n="<<n<<endl;}
  };
  void main()
  {
  Sample s1(10),s2(20),s3(30),s4(40);
  s1.add(s2);
  s1.add(s3);
  s1.add(s4);
  s1.disp();
  cout<<endl;
  }
  
  本程序的執行結果如下:
  n=100
  
  ---------------------------------------------------
  
  題8.編寫一個程序,設計一個點類Point,求兩個點之間的距離。
  解:
  設計一個普通函數distance(Point &p1,Point &p2),用於計算p1和p2點之間的距離。
  本題程序如下:
  #include<iostream.h>
  #include<math.h>
  class Point
  {
  int x,y;
  public:
  Point(int i,int j){x=i;y=j;}
  int getx(){ return x;}
  int gety(){ return y;}
  void disp()
  {
  cout<<"("<<x<<"'"<<y<<")";
  }
  };
  float distance(Point &p1,Point &p2) // 對象引用作為參數
  {
  float d;
  d=sqrt((p1.getx()-p2.getx())*(p1.getx()-p2.getx())+
  (p1.gety()-p2.gety())*(p1.gety()-p2.gety()));
  return d;
  }
  void main()
  {
  Point p1(2,2),p2(5,5);
  p1.disp(); cout<<"與"; p2.disp();
  cout<<"之間距離="<<distance(p1,p2)<<endl;
  }
  
  本程序執行結果如下
  (2,2) 與 (5,5) 之間距離=4.24264
  
  -----------------------------------------------------
  
  題9.編寫一個程序,設計一個職工類Person,一個系有若干個職工,按職務分為系主任、室主任和職工,給出他們之間的領導關系。
  解:
  類Person有姓名、職務和指向領導的指針等私有數據,以及兩個構造函數和以下成員函數:setleader()(設置當前職工的領導);getname()(獲取職工姓名);getleader()(獲取領導者對象指針);disp()(輸出姓名和職務)。
  本題程序如下:
  #include<iostream.h>
  #include<stdio.h>
  #include<string.h>
  class Person
  {
  char name[10];
  char prof[10];
  Person *leader;
  public:
  Person(){strcpy(name,"
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved