没有合适的资源?快使用搜索试试~ 我知道了~
首页Visual C++趣味编程:初学者指南
Visual C++趣味编程:初学者指南
需积分: 13 1 下载量 37 浏览量
更新于2024-07-29
收藏 6.73MB PDF 举报
"《趣味程序导学:Visual C++》是一本由董未名和汤筠编著的实用教程,旨在通过编写各种有趣的计算机游戏,如“幸运52”、“速算24”、“俄罗斯方块”、“拼图游戏”以及“属于你的OICQ”,来引导读者学习Visual C++编程。该书针对的是初学者和对游戏程序感兴趣的电脑爱好者,以示例驱动的方式深入浅出地讲解了Visual C++的基础知识和编程技巧。 本书首先介绍了Visual C++的基本概念,包括其新特性,强调了面向对象编程的要点,如基本概念、继承和多态性。读者将通过这些游戏程序的实例,逐步掌握消息处理、多媒体、图形图像、数据库处理以及网络编程等关键领域的知识。作者特别关注于Visual C++集成开发环境(IDE)的使用,如AppWizard工具、工程和工程工作区、ClassWizard工具以及WizardBar工具栏,这些是进行实际编程不可或缺的部分。 在第1章中,作者指导读者如何创建和运行他们的第一个工程,包括基于文本框和对话框的应用程序,并解释了Microsoft基本类库和应用程序框架的作用。这些章节的设计旨在让读者在实践操作中理解和掌握编程原理,从而提高技能。 总体来说,《趣味程序导学:Visual C++》不仅是一本理论教材,更是一本实践手册,它以创新的教学方式,帮助读者在轻松愉快的环境中学习Visual C++,为他们日后在IT领域的发展打下坚实的基础。通过这本书,读者不仅能学到编程技术,还能培养解决问题和创新思维的能力。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/3970158/bg10.jpg)
第 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. 其他的类成员函数
类除了包含构造函数和析构函数外,还可以包含其他成员函数。类不但要有建立和撤
消对象的功能,更主要的是还要具有操作和处理对象的功能以便完成特定的任务。这些功
![](https://csdnimg.cn/release/download_crawler_static/3970158/bg11.jpg)
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)
{
![](https://csdnimg.cn/release/download_crawler_static/3970158/bg12.jpg)
第 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个读写函数间接访问。
![](https://csdnimg.cn/release/download_crawler_static/3970158/bg13.jpg)
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();
};
![](https://csdnimg.cn/release/download_crawler_static/3970158/bg14.jpg)
第 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页未读,继续阅读
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![audio/mpeg](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
xinjiekou
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Hadoop生态系统与MapReduce详解
- MDS系列三相整流桥模块技术规格与特性
- MFC编程:指针与句柄获取全面解析
- LM06:多模4G高速数据模块,支持GSM至TD-LTE
- 使用Gradle与Nexus构建私有仓库
- JAVA编程规范指南:命名规则与文件样式
- EMC VNX5500 存储系统日常维护指南
- 大数据驱动的互联网用户体验深度管理策略
- 改进型Booth算法:32位浮点阵列乘法器的高速设计与算法比较
- H3CNE网络认证重点知识整理
- Linux环境下MongoDB的详细安装教程
- 压缩文法的等价变换与多余规则删除
- BRMS入门指南:JBOSS安装与基础操作详解
- Win7环境下Android开发环境配置全攻略
- SHT10 C语言程序与LCD1602显示实例及精度校准
- 反垃圾邮件技术:现状与前景
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)