找回密码
 注册

QQ登录

只需一步,快速开始

查看: 885|回复: 0

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

[复制链接]
发表于 2021-2-25 11:52:06 | 显示全部楼层 |阅读模式
    C/C++语言程序设计辅导资料十六
一、主题:类与对象二、学习时间:2020年7月13日-7月19日“不忘初心、牢记使命”主题理论学习:
我们党要始终成为时代先锋、民族脊梁,始终成为马克思主义执政党,自身必须始终过硬。全党要更加自觉地坚定党性原则,勇于直面问题,敢于刮骨疗毒,消除一切损害党的先进性和纯洁性的因素,清除一切侵蚀党的健康肌体的病毒,不断增强党的政治领导力、思想引领力、群众组织力、社会号召力,确保我们党永葆旺盛生命力和强大战斗力。
摘选自《决胜全面建成小康社会,夺取新时代中国特色社会主义伟大胜利》三、知识脉络:
第11章 类与对象
11.4 this指针、static成员与const对象
11.5 友元函数和友元类
11.6 构造函数与析构函数
11.7 对象数组和综合案例四、学习要求:
掌握this指针
掌握static关键字和static空间
掌握static数据的定义和初始化
理解static变量与全局变量的区别
掌握static函数
理解const关键字,掌握C++常量的定义方法
掌握const函数和const对象
理解C++中友元的意义和作用
掌握友元函数的定义与调用
掌握友元类的定义与使用
掌握C++对象数组的声明及数组元素的访问方式五、重点难点:
this指针
static成员
const对象
友元六、主要内容:
1.this指针
每个对象有自己独立的数据空间,但是类的成员函数只存储一份,为所有对象共享;
当通过对象调用非静态成员函数时,需要把调用对象的地址也传递给成员函数,以确定成员函数要处理的数据是哪一个对象的数据,成员函数通过this指针接收调用对象的地址,所以每个成员函数(非静态的)都有一隐含的指针变量this。
void Clock::setClock (int h, int m, int s){
hour=h;  minute=m;  second=s;  }  等同于
void Clock::setClock (Clock *this, int h, int m, int s) {
this->hour=h;  this->minute=m;  this->second=s;}2.static成员
在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员,静态数据成员也被称作是类的成员。
无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的所有对象共享访问;
对该类的多个对象来说,静态数据成员只分配一次内存;
静态数据成员的值对每个对象都是一样的,而非静态数据成员,每个类对象都有自己的拷贝。
静态数据成员初始化
<数据类型><类名>::<静态数据成员名>=<值>
如:int X::s = 0 ;
初始化在类体外进行,而前面不加static;
初始化时不加该成员的访问权限控制符public、protected、private等;
若未在类外初始化,程序连接时会出现错误
sizeof运算符不包含静态数据成员的空间
静态数据成员访问
<类对象名>.<静态数据成员名>
或 <类类型名>::<静态数据成员名>
静态数据成员和普通数据成员一样遵从public、protected、private访问规则。
静态成员函数
成员函数前面加static修饰成静态成员函数
静态成员函数声明时前面加static关键字,在类外写函数实现时不需要关键字static
静态成员函数是不依赖于对象成员的函数,通常用来定义一些工具函数
普通的成员函数一般都隐含了一个this指针,静态成员函数由于不是与任何的对象相联系,因此它不具有this指针;
静态成员函数可以访问静态数据成员和访问静态成员函数,但是静态成员函数不能访问非静态成员函数和非静态数据成员;
非静态成员函数可以任意地访问静态成员函数和静态数据成员3.Const关键字
数据的安全性可以通过访问控制权限管理;
const控制读写权限;
类中某些数据成员的值是不需要改变的,如数学类的π、物理类的g等都是常量,可以用关键字const来声明常数据成员。
因为常数据成员的值是不能改变的,所以,定义对象时必须初始化,需要通过构造函数的初始化列表对常数据成员进行初始化。
Const数据成员
class  Clock
{
private :
    const int hour;                 //常量数据
    int  minute, second;            //非常量数据
public :
    Clock (int h, int m, int s):hour(h),minute(m),second(s){ }
};
Const函数
定义的类的成员函数不改变类的数据成员(比如打印函数),这些函数是“只读”函数,加上const关键字进行标识,标识为常成员函数。声明常成员函数格式如下:类型 成员函数名(参数表) const;
class  Clock{
private :
    int hour, minute, second;            
public :
    void setClock (int h, int m, int s){
          hour=h;  minute=m; second=s;   }
    void showClock ( ) const{    //常成员函数
        cout<<hour<<minute<<second;  }
};
常成员函数可以引用const数据成员,也可以引用非const的数据成员,只要在常成员函数不改变数据成员即可;
const数据成员可以被const成员函数引用,也可以被非const的成员函数引用,只要const数据成员不被修改即可;
常成员函数不能调用另一个非常成员函数,因为非常成员函数是可以改变数据成员的,这样常成员函数就间接改变了数据,违背了常成员函数的定义规则。
Const对象
定义常对象的一般形式为:
类名 const 对象名[(实参表列)]; 或 const 类名 对象名[(实参表列)];
一个对象被声明为常对象,则不能调用该对象的非const型的成员函数(除了由系统自动调用的隐式的构造函数和析构函数)。4.友元函数
理解友元:类的私有成员只能在类的定义范围内使用,也就是说,类的私有成员只能通过本类的成员函数来访问,但有时候又需要在类的外部访问类的私有成员,甚至需要同时访问多个类的私有成员,为此引入友元。
友元函数是在类声明中用关键字friend说明的非成员函数。
友元函数不是当前类的成员函数,而是独立于当前类的外部函数,可以访问该类的所有对象的私有或公有成员;
友元函数声明可以放在私有部分,也可放在公有部分(因为它不是成员,不受访问控制权限的约束)。
友元函数不能通过this指针引用对象的成员,因为友元函数非对象成员。
声明为友元函数的一般形式为:
    friend<数据类型><友元函数名>(参数表);
如果一个类的成员函数是另一个类的友元函数,则称这个成员函数为友元成员函数;
通过友元成员函数,不仅可以访问自己所在类对象中的私有和公有成员,还可访问由关键字friend声明语句所在的类对象中的私有和公有成员。5.友元类
当一个类作为另一个类的友元时,称这个类为友元类。
当一个类成为另一个类的友元类时,这个类的所有成员函数都成为另一个类的友元函数
友元类的声明可以放在类声明中的任何位置。
友元关系是不能传递的。类B是类A的友元,类C是类B的友元,并不表示类C是类A的友元。
友元关系是单向的。类A是类B的友元,类A的成员函数可以访问类B的私有成员和保护成员,反之,类B不是类A的友元,类B的成员函数却不可以访问类A的私有成员和保护成员。
友元类声明的形式如下:firiend class <友元类名>;6.对象数组
数组元素不仅可以由简单类型组成(例如,整型数组的每一个元素都相当于一个整型变量),也可以由对象组成(对象数组的每一个元素都是同类型的对象)。
数组定义:
Student stud[3]={ Student("zhang san",20,60), Student("Li si",19,70), Student("Wang wu",18,78)  };七、习题:
1.下述静态数据成员的特性中,(      )是错误的。
A.说明静态数据成员时前面要加修饰符static
B.静态数据成员要在类体外进行初始化
C.在程序中引用公有静态数据成员时,要在静态数据成员名前加<类名>和作用域运算符
D.静态数据成员是个别对象所共用的
答案:D2.对静态成员的不正确描述是(   )
A.静态成员不属于对象,是类的共享成员   
B.静态数据成员要在类外定义和初始化
C.调用静态成员函数时要通过类或对象激活,所以静态成员函数拥有this指针
D.非静态成员函数也可以操作静态数据成员
答案:C3.关于静态成员的描述中,(       )是错误的。
A.静态成员可分为静态数据成员和静态成员函数
B.静态数据成员定义后必须在类体内进行初始化
C.静态数据成员初始化不使用其构造函数
D.静态数据成员函数中不能直接引用非静态成员
答案:B4.以下关于静态成员变量的叙述不正确的是(         )
A.静态成员变量为类的所有对象所公有
B.静态成员变量可以在类内任何位置上声明
C.静态成员变量的赋初值必须放在类外
D.定义静态成员变量时必须赋初值
答案:D5.定义静态成员函数的主要目的是(         )
A.方便调用
B.有利于数据隐藏
C.处理类的静态成员变量
D.便于继承
答案:C6.以下叙述不正确的是(         )
使用静态数据成员:
A.可以节省内存空间
B.是为了解决数据共享问题
C.可以直接用类名来引用
D.可以提高序运算速度
答案:D7.关于this指针的说法错误的是(   )
A.this指针必须显示说明
B.当创建一个对象后,this指针就指向该对象
C.成员函数拥有this指针
D.静态成员函数不拥有this指针
答案:A8.设有定义:
class person
{ int num;
  char name[10];
public:
  void init(int n, char *m);
  ...
};
person std[30];
则以下叙述不正确的是(     )
A.std是一个含有30个元素的对象数组
B.std数组中的每一个元素都是person类的对象
C.std数组中的每一个元素都有自己的私有变量num和name
D.std数组中的每一个元素都有各自的成员函数init
答案:D9.下面对友元的错误描述是(   )
A.关键字friend用于声明友元                                   
B.一个类的成员函数可以是另一个类的友元
C.友元函数访问对象的成员不受访问特性影响      
D.友元函数通过this指针访问对象成员
答案:D10.关于友元的描述中,(       )是错误的。
A.友元函数是成员函数,它被说明在类体内
B.友元函数可直接访问类中的私有成员
C.友元函数破坏封装性,使用时尽量少用
D.友元类中的所有成员函数都是友元函数
答案:A11.下面对于友元函数描述正确的是(     )。
A.友元函数的实现必须在类的内部定义
B.友元函数是类的成员
C.友元函数破坏了类的封装性和隐藏性
D.友元函数不能访问类的私有成员
答案:C南开答案可以联系QQ 761296021

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

GMT+8, 2024-5-4 03:04

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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