没有合适的资源?快使用搜索试试~ 我知道了~
首页Visual C++趣味编程入门指南:实战游戏项目教学
Visual C++趣味编程入门指南:实战游戏项目教学
需积分: 13 2 下载量 58 浏览量
更新于2024-07-28
收藏 6.73MB PDF 举报
《趣味程序导学Visual C++》是一本由董未名和汤筠合著的专业书籍,针对初学者和对游戏程序感兴趣的电脑爱好者设计,旨在通过编写有趣的游戏程序,如"幸运52"、"速算24"、"俄罗斯方块"和"拼图游戏"等,帮助读者掌握Visual C++编程的基本方法和技巧。该书由清华大学出版社出版,采用示例教学法,将复杂的编程知识点融入到实际游戏项目中,让学习过程既生动又实用。 书中首先介绍了Visual C++的基础知识,包括其新特性以及面向对象编程的概念,如基本概念、继承和多态。通过1.4节,作者详细讲解了Visual C++集成开发环境(IDE),如AppWizard工具、工程和工程工作区、ClassWizard工具和WizardBar工具栏,让读者了解如何创建和管理项目。章节1.5指导读者如何创建第一个工程,分别展示了基于文本框和对话框的应用程序制作。 学习者可以跟随1.6节的内容,通过运行不同类型的程序,进一步熟悉程序执行流程,理解如何处理消息、多媒体应用、图形图像处理以及数据库和网络编程等高级主题。书中特别强调了Microsoft基本类库在应用程序框架中的作用,解释了为什么使用它能够简化开发过程。 作为一本教材,本书不仅注重理论知识的传授,还注重实践操作,旨在培养读者的编程技能和解决问题的能力。每个章节都配有实例代码,方便读者模仿和实践。版权方面,本书受到法律保护,任何未经授权的复制都是非法的。对于购买的正版图书,读者需确认封面上的清华大学出版社激光防伪标签。 《趣味程序导学Visual C++》是一本非常适合初学者系统学习和提升Visual C++编程能力的教材,通过寓教于乐的方式,让编程学习变得轻松且高效。
资源详情
资源推荐
第 1 章 初识 Visual C++ 7
{
cout<<"
调用了默认构造函数
"<<"\n";
X=0
;
Y=0
;
}
//-------------------------------------------------------
Tpoint:: Tpoint(in x, int y)
{
cout<<"
调用了非默认构造函数
"<<"\n";
X=x;
Y=y;
}
//---------------------------------------------------------
TPoint:: ~TPoint()
{
cout<<"
调用了析构函数
"<<"\n";
}
//-------------------------------------------------
运行结果如下:
调用了默认构造函数
调用了非默认构造函数
p1:0*1
p2:800*600
调用了析构函数
调用了析构函数
程序中main函数中的“{}”是用来限定两个对象的生命周期的,以便在程序退出之前
调用析构函数。在上例中不管在构造函数还是在析构函数的定义前面都有“ TPoint::”前缀,
它告诉编译器这个函数是TPoint类的成员函数。事实上,如果在函数外面定义成员函数都
要加这样的前缀。其中“∷”是域操作符,代表一种所属关系。
从上例可看出析构函数是不能人为调用的,它由编译器根据某对象是否已超出它的作
用域来决定是否调用它的析构函数。上面的析构函数没有做任何有实际意义的动作,仅仅
说明它已经被调用了,这是因为编译器会自动释放该对象所占用的空间,如果在构造函数
中使用new或其他方法在堆中申请了内存,这时就要在析构函数中使用delete或相应的释放
方法去释放内存,否则系统是不会释放内存的,这样就会产生内存漏洞。
如果没有编写自己的析构函数,那么编译器将产生一个默认析构函数。对于本身就是
C++对象的数据成员来说,默认析构函数会调用这些对象的析构函数。
4. 其他的类成员函数
类除了包含构造函数和析构函数外,还可以包含其他成员函数。类不但要有建立和撤
消对象的功能,更主要的是还要具有操作和处理对象的功能以便完成特定的任务。这些功
8 Visual C++趣味程序导学
能不宜在构造函数和析构函数中实现,所以需要其他成员函数来补充。对上面的例子作如
下改动:
//--------------------------------------------------
#include<iostream.h>
#include<conio.h>
//---------------------------------------------------
class TPoint
{
public:
int X;
int Y;
TPoint()
;
//
默认构造函数
TPoint(int x, int y);
~TPoint(); //
析构函数
int ReadX() const {return X;}
int ReadY() const {return Y;}
int WriteX(int x) const {return X=x;}
int WriteY(int y) const {return Y=y;}
}
;
//-------------------------------------------------------
void main()
{
{
TPoint p1;
TPoint p2(800,600);
cout<<"pl: "<<pl.X<<"*"<<pl.Y<<"\n";
cout<<"p2: "<<p2.X<<"*"<<p2.Y<<"\n";
}
getch();
}
//-------------------------------------------------------
TPoint:: TPoint()
{
cout<<"
调用了默认构造函数
"<<"\n";
X=0
;
Y=0
;
}
//---------------------------------------------------------
TPoint:: TPoint(in x, int y)
{
第 1 章 初识 Visual C++ 9
cout<<"
调用了非默认构造函数
"<<"\n";
X=x;
Y=y;
}
//---------------------------------------------------------
TPoint:: ~TPoint()
{
cout<<"
调用了析构函数
"<<"\n";
}
//---------------------------------------------------------
此时,这个类可以说是比较完善了。像其他成员函数一样,ReadX、ReadY、WriteX
和WriteY可以直接访问类中所有的成员。这里在两个读函数定义之后加了关键字const,意
味着在这些函数内不允许对数据成员进行赋值操作,如果在这些函数中有下面类型的语句
如“X=800”,编译器就会报错。
5.类成员的三个区
上面的类虽然比较完善了,但是并不实用。因为这个时候还可以随意访问对象的数据
成员,这是不符合数据封装准则的。可以对类定义作如下的修改:
//---------------------------------------------------
class TPoint
{
private:
int X;
int Y;
public:
TPoint()
;
//
默认构造函数
TPoint(int x, int y);
~Tpoint(); //
析构函数
int ReadX() const {return X;}
int ReadY() const {return Y;}
int WriteX(int x) const {return X=x;}
int WriteY(int y) const {return Y=y;}
}
;
//-------------------------------------------------------
修改之后,除非调用读写成员函数,否则在类之外将无法直接访问数据成员X、Y。这
是因为类的成员分三个区,分别用private、public、protected来说明。凡是定义在public内的
成员可以被类外程序直接访问;凡是定义在private区的类成员,只能被本类的成员函数直
接访问,类外的程序则必须通过类区的成员函数间接访问。例如在上例中,对于由TPoint
定义的对象,不能通过对象名直接对X、Y进行访问,必须通过4个读写函数间接访问。
10 Visual C++趣味程序导学
具体编程时,必须结合使用public与private两个区,把需要保护的类成员放到private区,
使之封装起来不易受到外界的干扰。但是建立类是必须使之与外界发生关系的,否则就毫
无意义,为此,需要public成员以便与外界通信。这清楚地说明了C++的封装性质。在复杂
的类中,封装显得尤为重要,因为类越复杂,对类内部的访问控制就越严格。
1.3.2. 继承和多态
1. 继承的引出
自然界中很多客观事物具有很多共性,比如人与猿之间、火车与汽车之间、大炮与机
枪之间明显地有很多共性,但是他们之间又有很多的不同。C++解决 “类似但有不同”问
题的方法是——允许类从一个或多个其他类(在这里称为基类)继承其特性和行为,参看
下面的例子:
//-------------------------------------------------------------
class PrintedDocument
{
//
成员列表
}
;
//Book
类从
PrintedDocument
类派生出来
class Book: public PrintedDocument
{
//
成员列表
};
//---------------------------------------------------------------
我们称从其他类继承而来的类为派生类,而一个派生类本身也可以被其他类继承,必
须以适当的方式来对继承得到的成员进行访问。为了保证基类数据封装的安全,无论何种
继承方式得到的派生类都不能直接访问基类的private区成员。派生类的语法格式为:
class
类名:
<
访问权限
>
基类名列表
{
类定义体
}
;
基类名列表中各基类用逗号隔开。其中访问权限可以是public或private,它们表示两种
不同的继承方式:以public方式继承得到的成员属性与其基类中的属性相同;以private方式
继承得到的成员属性将全部成为private属性。前面提到的protected区成员在使用上与private
区成员完全一样,惟一不同只是在派生时,protected 区成员可以被派生类直接访问,即对
派生类来说是可见的。例如:
//----------------------------------------------
class Document
{
public:
char *Name;
void PrintNameOf();
};
第 1 章 初识 Visual C++ 11
//-----------------------------------------------
void Document::PrintNameOf()
{
cout<<Name<<"\n";
}
//-----------------------------------------------
class Book:public Document
{
public:
Book(char *name, long pagecount);
private:
long PageCount;
};
//-----------------------------------------------
//Book
类的构造函数
Book::Book(char *name, long pagecount)
{
Name=new char[strlen(name)+1];
strcpy(Name, name);
PageCount=pagecount;
}
//-----------------------------------------------
2. 类派生引出的成员覆盖问题
在继承中,派生类包含所有的基类成员,同时加入自己的新成员。因此派生类可以根
据派生时的成员访问机制访问基类的任何成员(除非这些成员在派生类中重新进行了定
义)。当基类的成员在派生类里面被重新定义时,可以用域操作符“∷”来强制调用基类
成员。在上面的例子中,如果在Book中重新定义了PrintNameOf函数,而又要调用基类的
PrintNameOf函数,只能通过域操作符“∷”强制调用,如下所示:
//-----------------------------------------------------------
class Book: public Document
{
public:
Book(char *name, long pagecount);
private:
long PageCount;
};
//-----------------------------------------------------------
void Book:: PrintNameOf()
{
cout<<"Name of book: ";
Document:: PrintNameOf();
剩余296页未读,继续阅读
嘻嘻之心
- 粉丝: 3
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 最优条件下三次B样条小波边缘检测算子研究
- 深入解析:wav文件格式结构
- JIRA系统配置指南:代理与SSL设置
- 入门必备:电阻电容识别全解析
- U盘制作启动盘:详细教程解决无光驱装系统难题
- Eclipse快捷键大全:提升开发效率的必备秘籍
- C++ Primer Plus中文版:深入学习C++编程必备
- Eclipse常用快捷键汇总与操作指南
- JavaScript作用域解析与面向对象基础
- 软通动力Java笔试题解析
- 自定义标签配置与使用指南
- Android Intent深度解析:组件通信与广播机制
- 增强MyEclipse代码提示功能设置教程
- x86下VMware环境中Openwrt编译与LuCI集成指南
- S3C2440A嵌入式终端电源管理系统设计探讨
- Intel DTCP-IP技术在数字家庭中的内容保护
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功