gu 主讲人:王国军 教授ieee-trustcom.org/faculty/~csgjwang/gucoursedownload/oop/...3:c++...
TRANSCRIPT
GU
广州大学
计算机科学与网络工程学院
主讲人:王国军 教授
[email protected]://trust.gzhu.edu.cn/
电话:020-39366920手机:13360581866办公室:行政西楼前座429B室根据《C++程序设计基础》(第5版)(上)和《Visual C++
面向对象与可视化程序设计》(第4版)制作,仅供广州大学计算机、软件工程、网络工程、网络空间安全2019级讲课使用。
本课程的性质
v计算机应用广泛到各行各业,几乎所有行业、领域都需要使
用计算机解决问题:程序设计(Programming)非常重要! v本课程的教学目标不是马上培养一个会使用某种面向对象
程序设计语言(例如C++语言)的程序员,而是强调对程序设
计语言的理解和应用;同时,本课程还介绍如何使用微软基
础类库(MFC)进行简单的可视化程序设计。
v《面向对象程序设计》是计算机科学与技术本科专业、以及
相关本科专业包括软件工程、网络工程、信息安全、网络空间
安全*、人工智能*、物联网工程**、数据科学与大数据技术**等
的一门重要的专业基础课。
2.熟悉Visual C++编程工具以及Visual Studio开发平台和环
境,能结合实际问题组织数据结构,正确分析问题,设计合
理的解决方案。
基本要求
1.熟练掌握C++面向对象程序设计方法,初步掌握基于MFC的
Windows可视化程序设计方法。
先修:专业导论、程序设计基础
后续:面向对象分析与设计、软件工程、数据结构、算法
分析与设计、计算机组成原理、操作系统、编译原
理等专业课程等专业课程
与其它课程的关系
课时安排与计分标准
总学时 理论 实验
80 48 32
理论课:考试:60%;课堂考勤:13%;随堂测验/讨论:12%;作业:15%。
教材1:C++程序设计基础第5版(上),周霭如 林伟健 编著,
电子工业出版社,ISBN 9787121285950。
教材2:Visual C++面向对象与可视化程序设计(第4版),
黄维通 解辉 编著,高等教育出版社,ISBN 9787040455540。
参考书
1:新标准C++程序设计教程,郭炜 编著,清华大学出版社,
2012年8月。
2:C++语言程序设计(第4版),郑莉 编著,清华大学出版
社,2018年6月。
3:C++ Primer Plus(第6版)中文版,[美]Stephen Prata 著,
人民邮电出版社,2012年7月。
教材1 教材2
第6章 类与对象 第1章 Windows编程基础
第7章 运算符重载 第2章 对话框
第8章 继承 第3章 常用控件
第9章 虚函数与多态性 第4章 菜单、工具栏和状态栏
第10章 模板 第5章 框架窗口、文档和视图
第11章 输入流/输出流 第6章 图形、文本
内 容
6.1 类和对象的定义与访问
6.2 构造函数和析构函数
6.3 类的其他成员
6.4 类的包含
第6章 类与对象
(清华郑莉老师第6章数组、指针与字符串)对象数组
(8分钟):
https://next.xuetangx.com/learn/THU08091000247/TH
U08091000247/1515741/video/1358735
简评:
1、定义对象数组的语法其实和定义基本类型的其他数组
是一样的。
2、对象数组中每一个元素对象被创建时,系统都会调用
类构造函数初始化该对象。
MOOC视频与简评
(清华郑莉老师第6章数组、指针与字符串)对象指针
(10分钟):
https://next.xuetangx.com/learn/THU08091000247/TH
U08091000247/1515741/video/1358762
简评:
1、定义一个对象指针实际上跟定义其他类型的指针是一
样的。
Point a(4, 5);
Point *p1 = &a;
cout << p1->getX() << endl;
MOOC视频与简评
(清华郑莉老师第6章数组、指针与字符串)动态分配
与释放内存(9分钟):
https://next.xuetangx.com/learn/THU08091000247/TH
U08091000247/1515741/video/1358765
简评:
1、当你必须用动态内存分配的方式去申请内存单元的时
候,动态分配的这些单元没有机会给它取变量名,
没有机会给它取数组名,它返回就是一个首地址,
我们迫不得已就必须用地址(指针)去访问存储空
间了。
MOOC视频与简评
对于C++的动态存储分配,下列说法正确的是?
new和delete是C++语言中专门用于动态内存分配和释放的函数
动态分配的内存空间也可以被初始化
当系统内存不够时,会自动回收不再使用的内存单元,因此程序中不必用delete释放内存空间当动态分配内存失败时,系统会立刻崩溃,因此一定要慎用new
A
B
C
D
提交
单选题 1分
(清华郑莉老师第6章数组、指针与字符串)申请和释放
动态数组(一)(10分钟):
https://next.xuetangx.com/learn/THU08091000247/TH
U08091000247/1515741/video/1358767
简评:
1、课堂上只看一维数组部分(前5分钟)
2、Point *ptr = new Point[2]; //创建对象数组
3、delete[] ptr; //删除整个对象数组
MOOC视频与简评
(清华郑莉老师第6章数组、指针与字符串)申请和释放
动态数组(二)(7分钟):
https://next.xuetangx.com/learn/THU08091000247/TH
U08091000247/1515741/video/1358769
简评:
1、动态数组类:ArrayOfPoints
2、Point *points; //指向动态数组首地址
3、int size; //数组大小
MOOC视频与简评
(清华郑莉老师第6章数组、指针与字符串)浅层复制
与深层复制(8分钟):
https://next.xuetangx.com/learn/THU08091000247/TH
U08091000247/1515741/video/1358776
简评:
1、浅层复制:实现对象间数据元素的一一对应复制。
2、深层复制:当被复制的对象数据成员是指针类型时,
不是复制该指针成员本身,而是将指针所指对象进
行复制。
MOOC视频与简评
(北大郭炜老师第三周类和对象提高)this指针
(15分钟):
http://www.icourse163.org/learn/PKU-
1002029030?tid=1450432459#/learn/content?typ
e=detail&id=1214925558
简评:
1、C++类的(非静态)成员函数翻译成C的全局函数(多
一个参数:this指针)
2、因为静态成员函数并不作用于某个对象,静态成员函
数中不能使用this指针!
MOOC视频与简评
(北大郭炜老师第三周类和对象提高)静态成员
(19分钟):
http://www.icourse163.org/learn/PKU-
1002029030?tid=1450432459#/learn/content?typ
e=detail&id=1214925559
简评:
1、class CRectangle {...};
2、static int nTotalArea; //静态数据成员
static int nTotalNumber; //静态数据成员
3、static void PrintTotal(); //静态成员函数
MOOC视频与简评
(北大郭炜老师第三周类和对象提高)成员对象
和封闭类(14分钟):
http://www.icourse163.org/learn/PKU-
1002029030?tid=1450432459#/learn/content?typ
e=detail&id=1214925560
简评:
1、CCar类;
2、CTyre类;
3、CEngine类;
MOOC视频与简评
(北大郭炜老师第三周类和对象提高)常对象、常成员函
数和常引用(9分钟):
http://www.icourse163.org/learn/PKU-
1002029030?tid=1450432459#/learn/content?typ
e=detail&id=1214925561
简评:
1、规则、规则和规则!
2、理解、理解和记忆!
3、int GetValue() const { return n; }
int GetValue() { return 2*n; }
MOOC视频与简评
下列关于常成员的说法不正确的是哪一个?
常数据成员必须进行初始化,并且不能被更新常数据成员可以在定义时直接初始化(C++11)
常成员函数不可以被非常对象调用
常数据成员通过构造函数的成员初始列表进行初始化
A
B
C
D
提交
单选题 1分
(北大郭炜老师第三周类和对象提高)友元(9分钟):
http://www.icourse163.org/learn/PKU-
1002029030?tid=1450432459#/learn/content?typ
e=detail&id=1214925562
简评:
1、class CCar {...};
class CDriver {...};
2、友元函数(全局函数,成员函数)、友元类。
3、对C程序员的“妥协”(“破坏”封装和隐藏的机制)。
MOOC视频与简评
6.3&6.4更多MOOC视频:
清华郑莉老师第5章数据的共享与保护-标识符的作用域与
可见性
清华郑莉老师第5章数据的共享与保护-对象的生存期
清华郑莉老师第5章数据的共享与保护-静态数据成员
清华郑莉老师第5章数据的共享与保护-静态函数成员
清华郑莉老师第5章数据的共享与保护-类的友元
清华郑莉老师第5章数据的共享与保护-共享数据的保护
MOOC视频与简评
(6.1 类和对象的定义与访问)下列类的定义中正确的是()。(按照C++98标准答题)
class a{int x=0;int y=1;}
class b{int x=0;int y=1;};
class c{int x;int y;}
class d{int x;int y;};
A
B
C
D
提交
单选题 1分
(6.1 类和对象的定义与访问)若有以下说明,则在类外使用对象objX成员的正确语句是()。
objX.a=0;
objX.fun1();
objX.fun2();
X::fun1();
A
B
C
D
提交
单选题 1分
(6.1 类和对象的定义与访问)在类定义的外部,可以被访问的成员有()。
所有类成员
private或protected的类成员
public的类成员
public或private的类成员
A
B
C
D
提交
单选题 1分
(6.1 类和对象的定义与访问)下列关于类和对象的说法中,正确的是( )。
编译器为每个类和类的对象分配内存
类的对象具有成员函数的副本
类的成员函数由类来调用
编译器为每个对象的数据成员分配内存
A
B
C
D
提交
单选题 1分
(6.1 类和对象的定义与访问)关于this指针的说法正确的是( )。
this指针必须显式说明
定义一个类后,this指针就指向该类
成员函数拥有this指针
静态成员函数拥有this指针
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)下面对构造函数的不正确描述是()。
用户定义的构造函数不是必须的
构造函数可以重载
构造函数可以有参数,也可以有返回值
构造函数可以设置默认参数
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)下面对析构函数的正确描述是( )。
系统在任何情况下都能正确析构对象
用户必须定义类的析构函数
析构函数没有参数,也没有返回值
析构函数可以设置默认参数
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)构造函数是在( )时被执行的。
建立源程序文件
创建对象
创建类
程序编译时
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)在下列函数原型中,可以作为类Base析构函数的是( )。
void~Base
~Base()
~Base()const
Base()
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)AB是一个类,那么执行语句“AB a(4), b[3], *p;”调用了( )次构造函数。
2
3
4
5
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)下面关于复制构造函数调用的时机,不正确的是( )调用。
访问对象时
对象初始化时
函数具有类类型传值参数时
函数返回类类型值时
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)说明一个类的对象时,系统自动调用( )。
成员函数
构造函数
析构函数
友元函数
A
B
C
D
提交
单选题 1分
(6.2 构造函数和析构函数)程序中撤销一个类对象时,系统自动调用( )。
成员函数
构造函数
析构函数
友元函数
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)在下列选项中,( )不是类的成员函数。
构造函数
析构函数
友元函数
复制构造函数
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)下面对友元的错误描述是( )。
关键字friend用于声明友元
一个类中的成员函数可以是另一个类的友元
友元函数访问对象的成员不受访问特性影响
友元函数通过this指针访问对象成员
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)已知类A是类B的友元,类B是类C的友元,则下面选项描述正确的是( )。
类A一定是类C的友元
类C一定是类A的友元
类C的成员函数可以访问类B的对象的任何成员
类A的成员函数可以访问类B的对象的任何成员
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)下述关于类的静态成员的特性中,描述错误的是( )。
说明静态数据成员时前边要加修饰符static
静态数据成员要在类体外定义
引用静态数据成员时,要在静态数据成员前加<类名>和作用域运算符
每个对象有自己的静态数据成员副本
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)若有以下说明,则对n的正确访问语句是( )。
n=1;
Y::n=1;
objY::n=1;
Y->n
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)若有以下类Z说明,则函数fStatic中访问数据a错误的是( )。
void Z::fStatic() {objZ.a =1;}
void Z::fStatic() { a = 1; }
void Z::fStatic() { this->a = 0; }
void Z::fStatic() { Z::a = 0; }
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)若有以下类W说明,则函数fConst的正确定义是( )。
void W::fConst( int&k )const { k = a; }void W::fConst( int&k )const { k = a++; }void W::fConst( int&k )const { cin>> a; }void W::fConst( int&k )const { a = k; }
A
B
C
D
提交
单选题 1分
(6.3 类的其他成员)若有以下类T说明,则函数fFriend的错误定义是( )。
void fFriend( T &objT, int k ) { objT.i = k; }void fFriend( T &objT, int k ) { k = objT.i; }void T::fFriend( T &objT, int k ) { k += objT.i; }void fFriend( T &objT, int k ) { objT.i += k; }
A
B
C
D
提交
单选题 1分
(6.4 类的包含)若class B中定义了一个class A的类成员A a,则关于类成员的正确描述是( )。
在类B的成员函数中可以访问A类的私有数据成员在类B的成员函数中可以访问A类的保护数据成员类B的构造函数可以调用类A的构造函数进行数据成员初始化类A的构造函数可以调用类B的构造函数进行数据成员初始化
A
B
C
D
提交
单选题 1分
(6.4 类的包含)下列关于类的包含描述正确的是( )。
可以使用赋值语句对对象成员进行初始化
可以使用“参数初始式”调用成员类的构造函数初始化对象成员
被包含类可以访问包含类的成员
首先执行自身构造函数,再调用成员类的构造函数
A
B
C
D
提交
单选题 1分
习题一
作 业