找回密码
 注册

QQ登录

只需一步,快速开始

查看: 709|回复: 0

大工20春《c&c 语言程序设计》十五

[复制链接]
发表于 2021-2-25 11:38:19 | 显示全部楼层 |阅读模式
    C/C++语言程序设计辅导资料十五
一、主题:类与对象二、学习时间:2020年7月6日-7月12日“不忘初心、牢记使命”主题理论学习:
群众路线是我们党的生命线和根本工作路线,是我们党永葆青春活力和战斗力的重要传家宝。不论过去、现在和将来,我们都要坚持一切为了群众,一切依靠群众,从群众中来,到群众中去,把党的正确主张变为群众的自觉行动,把群众路线贯彻到治国理政全部活动之中。
                      摘选自《坚持和运用好毛泽东主席思想活的灵魂》《习近平谈治国理政》三、知识脉络:
第11章 类与对象
11.1 类的定义与实现
11.2 对象的定义与访问
11.3 构造函数与析构函数
11.4 拷贝构造函数四、学习要求:
理解类,掌握类的概念
掌握C++语言类的定义
掌握C++语言类的实现
理解对象,掌握对象的概念,区别类与对象
掌握C++的对象的定义和存储空间
掌握C++对象的访问
理解构造函数的作用
掌握C++构造函数语法格式和调用方法
掌握C++默认构造函数
理解析构函数的作用
掌握C++析构函数语法格式和调用方法
理解构造函数的作用
掌握C++构造函数语法格式和调用方法五、重点难点:
C++语言类的定义、实现
对象的访问
C++构造函数的语法、调用
C++析构函数的语法、调用六、主要内容:
1.类的定义与实现
理解类
类是具有相同或相似性质的对象的抽象。抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。
类还起到封装的作用,封装有两个含义:一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位;二是尽可能隐蔽对象的内部属性和实现细节,对外形成一道屏障,与外部的联系只能通过公共接口实现。
类的定义
class 类名
{
private:
        私有的成员数据和成员函数声明;
public:
    公有的成员数据和成员函数声明;
protected:
         保护的成员数据和成员函数声明;
};
类class是定义面向对象程序模块的数据类型,是“模板”。
类的定义是声明一个数据结构,而不是定义一个函数,定义的最后有分号结束。
说明类成员访问权限的关键字private、protected和public可以按任意顺序、任意出现多次,一个成员只能有一种访问权限。
不能在类内给数据成员赋初值,只有给对象数据成员赋初值。
成员函数可以重载,Clock中可以定义多个set函数。
类的实现
类内实现
class  Clock
{
private :
    int hour, minute, second;
public :
   void setClock (int h, int m, int s){
        hour= ( h >=0 && h <=23)? h : 0 ;
        minute= ( m >=0 && m <=59)? m : 0 ;
        second= ( s >=0 && s <=59)? s : 0 ;    }
void showClock ( ){
         cout<<hour<<minute<<second;    }
};
类外实现
class  Clock
{
private :
    int hour, minute, second;
public :
   void setClock (int h, int m, int s);
void showClock ( );
};
void Clock::setClock (int h, int m, int s){
hour= ( h >=0 && h <=23)? h : 0 ;
minute= ( m >=0 && m <=59)? m : 0 ;
second= ( s >=0 && s <=59)? s : 0 ;   }
void Clock::showClock ( ){
    cout<<hour<<minute<<second;     }2.对象的定义
在定义类的同时直接定义对象
class  Clock
{
private :
    int hour, minute, second;
public :
    void setClock(int h, int m, int s){…}
    void showClock ( ){…}
} clock1,clock2;
在定义类的同时直接定义对象,并且不给类命名
class  
{
private :
    int hour, minute, second;
public :
    void setClock(int h, int m, int s){…}
    void showClock ( ){…}
} clock1,clock2;
定义类以后,在使用对象之前再定义对象
class Clock
{
private :
    int hour, minute, second;
public :
    void setClock(int h, int m, int s){…}
    void showClock ( ){…}
};
Clock clock1,clock2;3.对象的存储空间
每个对象有各自的空间
Clock clock1,clock2;
clock1.setClock(1,2,3);
clock2.setClock(4,5,6);4.对象的访问
三种访问方式
Clock clock1;
clock1.setClock(1,2,3);   //对象名直接访问
Clock *p;              //p为指向Clock类型的指针
p=&clock1;            //p为指向clock1对象
Clock & clock3=clock2;  //clock3为对clock2的引用5.构造函数
构造函数是一种特殊的函数,主要用来在创建对象时初始化对象,即为对象成员数据赋初始值。
通常将构造函数声明为公有成员函数(不是必须的);
构造函数的名字与类名相同,不能任意命名;
构造函数不具有类型,无返回值,因而不能指定包括void在内的任何返回值类型。
构造函数语法格式
定义构造函数的语法格式为:
构造函数名(形参):初始化列表
{  函数体 }
初始化列表格式为:
成员名(实参)[, 成员名(实参)…]
例如
Clock(int h , int m , int s ): hour(h),minute(m) { second=s; }
构造函数的调用方式
构造函数的调用方式是在定义对象时自动执行的特殊成员函数,用户不能显示调用构造函数。
类名  对象名(实参列表);   或  类名*  对象名=new类名(实参列表);
当构造函数无参数时,对象名后面不能加空的括号。6.析构函数
析构函数的一般形式
class  类名
{  
     public:
        ……
      ~类名()
       {  指定的操作;}
};
析构函数,在对象生命周期结束自动执行析构函数,完成清理内存工作,并可以执行指定的其他操作。
析构函数是一种在结束对象调用时自动执行的特殊的成员函数,一个类中只能定义一个析构函数。
析构函数声明为公有成员,析构函数名由波折号“~”与类名组合而成,析构函数不接受参数(所以不能重载,只有一个析构函数),没有返回值。
举例:
class Point
{
private:
   double x, y;
   char *name;                  
public:
Point(char *n=NULL, double x=0.0, double y=0.0);
   ~Point();
   void disp( );               
};
Point:oint (char *n, double a, double b){
  x = a;  y = b;
  if(n) {
      name=new char[strlen(n)+1];
      strcpy(name,n);
  }
  else{
       name=new char[8];
       strcpy(name,"no name");
}
cout<<name<<"  constructing"<<endl;
}
Point::~Point(){
    cout<<name<<"  destructing"<<endl;
    delete [] name;
}
void  Point::disp( ){  cout<<name<<":"<<x<<","<<y<<endl;  }
void main(){
   // 定义对象
   Point p1("home",1.0,2.0);
   Point p2("school",3.0);
   Point p3;       
   // 输出对象
   cout<<"p1=";
   p1.disp();
   cout<<"p2=";
   p2.disp();
   cout<<"p3=";
   p3.disp();
}
结果:
home  constructing
school  constructing
no name  constructing
p1=home:1,2
p2=school:3,0
p3=no name:0,0
no name  destructing
school  destructing
home  destructing
对象析构的顺序恰好和对象的构造顺序相反。7.拷贝构造函数
对于一个对象,也可以定义用一个已经存在的对象进行初始化。这种初始化的方式需要调用拷贝构造函数来实现。
若不定义拷贝构造函数,则系统自动生成默认的拷贝构造函数,把已经存在对象的数据按位复制到新生成对象的空间。
拷贝构造函数一般形式
class  类名
{  
public:
类名( 类名& 形参)                    
{  拷贝构造函数的函数体     }        ……                       
};
拷贝构造函数的调用
构造函数是当定义一个新对象时自动调用的函数,是一个从无到有的过程;
拷贝构造函数利用一个已经存在的对象再生成一个新的对象;
Point p1(“home”,1.0,2.0);//对象p1生成时没参照现有对象
Point p2=p1;    //也可以写作 Point p2 (p1);
七、习题:
1.关于类和对象不正确的说法是(    )
A.类是一种类型,它封装了数据和操作
B.对象是类的实例
C.一个类的对象只有一个
D.一个对象必属于某个类
答案:C2.下列有关类的说法不正确的是(    )
A.类是一种用户自定义的数据类型
B.只有类中的成员函数或友元函数才能存取类中的私有成员
C.在类中,如果不作特别说明,所有的数据均为私有类型
D.在类中,如果不作特别说明,所有的成员函数均为公有类型
答案:D3.在类定义的外部,可以被访问的成员有(   )
A.所有类成员
B.private或protected的类成员
C.public的类成员           
D.public或private的类成员
答案:C4.以下叙述中不正确的是(     )
A.一个类的所有对象都有各自的数据成员,它们共享函数成员
B.一个类中可以有多个同名的成员函数
C.一个类中可以有多个构造函数、多个析构函数
D.在一个类中可以声明另一个类的对象作为它的数据成员
答案:C5.下面对析构函数的正确描述是(   )
A.系统不能提供默认的析构函数
B.析构函数必须由用户定义
C.析构函数没有参数
D.析构函数可以设置默认参数
答案:C6.对类的构造函数和析构函数描述正确的是( )。
A.构造函数可以重载,析构函数不能重载
B.构造函数不能重载,析构函数可以重载
C.构造函数可以重载,析构函数也可以重载
D.构造函数不能重载,析构函数也不能重载
答案:A7.拷贝构造函数具有的下列特点中,(       )是错误的。
A.如果一个类中没有定义拷贝构造函数时,系统将自动生成一个默认的
B.拷贝构造函数只有一个参数,并且是该类对象的引用
C.拷贝构造函数是一种成员函数
D.拷贝构造函数的名字不能用类名
答案:D8.已知类A中一个成员函数说明为: void set(A &a); ,其中A &a的含意是(   )
A.指向类A的指针为a
B.将a的地址值赋值给变量set
C.a是类A的对象引用,用来作函数set( )的形参
D.变量A与a按位相与作为函数set( )的参数
答案:C9.假设OneClass为一个类,则该类的拷贝初始化构造函数的声明语句为(   )
A.OneClass(OneClass p);
B.OneClass& (OneClass p);
C.OneClass(OneClass & p);
D.OneClass (OneClass *p);
答案:C南开答案可以联系QQ 761296021

QQ|手机版|小黑屋|网站地图|无忧答案网 ( 冀ICP备18010495号-1 )

GMT+8, 2024-5-4 02:18

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表