作者/侯晓琴 出版社/清华大学出版社
目录
第1篇 Visual C++开发环境及语言基础
- 开发环境及常用应用程序框架
- C++入门基础
- C++面向对象编程基础
- MFC运行机制
第2篇 Visual Studio图形编程
- 结合实例详解Windows标准控件
- 菜单
- 编辑工具栏和状态栏
- 图形图像
第3篇 Visual C++程序开发基础篇
- 数据文件读写
- 动态链接库
第4篇 Visual C++程序开发提高篇
- 多线程
- 网络编程
- 数据库编程
- 标准模板库(STL)
- 电子书管理系统
第一章 开发环境及常用应用程序框架
Visual C++是Microsoft公司开发的基于C/C++的可视化的集成开发工具,提供了Microsoft基本类库MFC。
#include<iostream> //输入输出语句的头文件
using namespace std; //std作用域
cin>> <变量名> ; //输入语句
cout<<"输出的内容"<< <变量名> <<endl; //输出语句(endl换行)
return 0; //返回值
按F5调试程序 Ctrl F5运行程序
机器语言→汇编语言→高级语言C
C语言:结构式语言——显著特点:代码及数据的分隔化
C→面向过程 / C++→面向对象
C+class→ C++
C++三大特性:封装、继承、多态
MFC应用程序有3种类型:基于单文档、基于多文档、基于对话框
MFC程序员常用3个类:CRect(限定一个区域)、CPoint(定义一个点的二维坐标值)、CString(对string的各种操作封装起来变成一个只能在MFC下使用的类)
MFC窗口类WNDCLASS(并不是一个真正意义上的类)
.cpp→ .obj→ .exe
语法错误→ 跟踪调试
调试菜单→ 新建断点→ 跟踪调试程序(跟屁虫式跟踪(逐语句/逐过程)F11、守株待兔式跟踪F5)
Win32应用程序(Win32 Application)
入口函数是WinMain()(有且只有一个),是基于Windows平台的32位开发环境开发的应用程序,也是普通的窗口应用程序。有注册窗口、创建窗口、显示窗口、消息处理等动作
Windows应用程序→ 空项目
一个基本的Win32应用程序要包括两个函数:WinMain()和实现窗口操作函数
应用场合:针对需要重新编写窗口
Win32控制台程序(Win32 Console Application)
入口函数是main()(有且只有一个),运行结果窗口是MS-DOS的样子,因为它是基于DOS平台开发的应用程序
应用场合:针对需要测试完善的代码,以便移植到其他框架下使用
MFC应用程序(MFC Application)
入口函数是WinMain()(在工作区的文件中看不到)
应用程序类型→ 单文档 不添加任何代码,MFC单文档程序就能运行出结果
应用场合:以MFC应用程序为基本框架继续开发自己的软件,可以省去一大部分工作内容
MFC动态链接库(MFC DLL)
针对MFC应用程序的动态链接库,入口函数为DllMain(),类似于MFC应用程序中的WinMain(),在自动生成的文件是看不到的
DLL类型→ 使用共享MFC DLL的规则DLL
这种项目运行结果是没有窗口的,因为它生成的并不是可执行文件,而是以.dll、.lib为后缀名的两个文件。如果想看结果,只需将其复制粘贴到可执行程序的当前路径下,并且让可执行程序调用其结果即可。
应用场合:当所编的程序不希望被权限之外的人看到源代码,以期保护原作者的权益,或者代码被封装成接口让别人使用,只要凭借输入输出参数即可运用。
开发环境:将多个项目形成一个集合、格式不规范的代码被自动对齐(Ctrl K F(注意顺序))
第二章 C++入门基础
C++全面性(界面开发不如VB、应用软件的开发效率不如Java、代码运行效率不如C)
C++数据类型分为基本与构造两大块
- 基本类型:整型(基本整型int、短整型short、长整型long、无符号型unsigned)、实型(浮点型)(单精度型float、双精度型double、扩展双精度型long double)、字符型char、布尔型bool、空类型void
- 构造类型:数组类型[]、指针类型*、结构体类型struct、共用体类型union、枚类型enum、类class
2字节:短整型 4字节:基本整型、长整型、单精度浮点 8字节:双精度浮点(32位计算机)
常量和变量
——基础数据类型
只要有赋值动作,变量的值一定会被改变/常量一经定义值不会被改变,即使有赋值行为
常量的定义与说明:
1.使用预处理命令:#define 常量名 常量值(末尾不需要分号)
2.使用const来定义常量:const 数据类型 常量名=常量值;(赋值会出错,必须在定义时初始化)
整型
——无符号可以和前三种结合使用,无符号顾名思义就是自然数(有符号的是整数)
int -32768~32767 即总共2^16个(占2个存储字节,每个字节8位)
利用头文件climits输出不同数据类型的最大值与最小值,例如cout<<INT_MAX<<endl或cout<<INT_MIN<<endl
整型、字符型数据的各种输出变量可以进入limits.h头文件查看
数据的定义和初始化:
1.类型修饰符 变量名;
** 变量名=数值;**
2.类型修饰符 变量名=数值;
浮点型数据的范围和有效位可以进入cfloat头文件查询
科学计数法:a*10^b→ a e b
双精度的有效位是15位 但是cout通常只输出6个有效位
执行cout.precision(n);或cout<<setprecision(n)(加入头文件iomanip)后cout输出的有效位数可达n个
字符型
——有符号字符、无符号字符 必须用单引号括起来且只能是一个字符
普通字符/转义字符(\a响铃、\n换行、"双引号、'单引号、\v竖向跳格、\b退格、\r回车、\反斜杠字符、\t制表符)
整数数据和字符数据是可以相互赋值的
布尔型
——只有两种状态:false/true 也可用0/1表示 所占内存1个字节 在运算中可以与整形相互转化 扮演的角色是判断某个状态是否发生、条件是否成立等
空类型
——又称为无值型 void 但不可以定义void类型的变量,一般用于函数的返回值和其参数类型
空类型void长度为0,值为空
用途:1.函数无返回值(如void main();) 2.函数不带参数(如void main(void);) 3.定义通用指针(如void *p)
结构体与共同体
不同点:内部成员是否有联系(结构体-需要/共同体-不需要)、变量所占内存长度(结构体-各成员之和(各成员分别占用各自独立的内存)/共同体-最长的成员变量的长度(全部成员共同占用一段内存))
书写格式:struct/union 结构体/共同体类型名{类型名 成员名;…};(大括号体外必须要有英文分号)
声明结构体或共同体意味着在有效作用域内,又有了新的数据类型,但是此时没有开辟任何存储空间,只有在定义该类型的变量后,才会有相应的空间。
初始化方法:1.逐一赋值 2.结构体类型名 变量名={成员1,成员2,成员3,…};
共同体所有成员都享用1个内存段,在每一瞬间共同体变量的内存只能存放其中一种而不是存放所有,也就是只有一个成员能实时地响应,后面的被赋值成员会影响原有的成员,当被访问内存时只有新成员起作用,因此共同体的初始化不能发生在定义共同体变量时。
指针变量
——用来存放变量地址的变量
4个特性:
1.指针变量的值不是一般的地址而是变量的地址
2.指针变量的值不可以人为任意给定,而必须是严格遵循当地计算机内存的地址值
3.通过指针变量中的值,再加上特殊运算符可以访问存放于该值的变量中的内容
4.指针变量中存放的地址值,只能是同它类型一样的变量的地址
定义:类型修饰符 *变量名;
初始化:类型修饰符 变量名1=对应类型修饰符的任意值;
变量名=&变量名1;(&取地址运算符)
运用指针变量获取地址所指向变量的值并改变它:变量名;
重要注意事项:在定义完指针变量后,它就必须被初始化*
实现面向对象编程的必要条件——类
父类→ 子类(共性→ 个性)
类包含两部分:成员变量和成员函数 类中的成员变量和成员函数都相互有联系(与结构体的区别在于结构体中只有变量,没有函数的实现)
类就是具有相同属性的具体物质的一种抽象概念,而它是共有属性的定义、实现(变量和函数)的集合
string类
string类就是对char的各种操作做了个封装 #include<string>
string str,str1,str2; str=str1+str2;(str2若为char可组合)
compare():对两个string变量进行比较(str.compare(str1))
length():获取string变量长度(str.length())
find():在元变量中找目标变量是从哪位开始(str.find(str1))
replace():替换(str,replace(a,b,"c")将第a到第b位换成c)
string变量的第1个字符是第0位
数组
数组的元素 编号/下标从0开始算起 数组元素在内存中连续存放
数组在定义时,数组大小可写也可不写
应用读写数据——一维数组
定义:
1.数组大小被提前告知:数据类型 数组名[数组大小];
2.数组大小不被提前告知:数据类型 数组名[]; 初始化形式:数组名[]={变量1,变量2,变量3,…};(这种形式只有在数组元素全部明确的前提下才可以用)
强制转换:(类型名)值
应用图像处理——二维数组
定义:数据类型 数组名[行数][列数];(这里的行数与列数也可不写,但不提倡)
应用处理字符串——字符型数组
长度为n的字符串需要n+1个字节的存储空间(必须以\n结尾)
\0是一个ASCII码值为0的不可显示字符,它标志着字符串的结束
在字符数组的初始化过程中,如果不足位就会补足'\0'这个字符
运算符
赋值运算符:=
算数运算符:+ - * / % ++ --
逻辑运算符:&& || !
关系运算符:< <= > >= == !=
优先级 | 运算符 | 具体功能 | 结合性 |
---|---|---|---|
1 | ++ -- | 位于变量后的自加、自减符 | 从左到右 |
2 | () | 括号 | 从左到右 |
3 | ++ -- | 位于变量前的自加、自减符 | 从右到左 |
4 | ! | 非 | 从右到左 |
5 | * / % | 乘、除、取余 | 从左到右 |
6 | + - | 加、减 | 从左到右 |
7 | < <= > >= | 小于、小于等于、大于、大于等于 | 从左到右 |
8 | = != | 等于、不等于 | 从左到右 |
9 | && | 与 | 从左到右 |
10 | ║ | 或 | 从左到右 |
11 | = | 赋值 | 从右到左 |
++(/--)x+n→先自增(/减)再计算 / x++(/--)+n→先计算再自增(/减)
在C++中对大于0的数值都是真,对小于等于0的数值都是假
流程控制语句
if-else / if-else if...-else
赋值表达式最后的条件始终为真
逗号表达式:按照从左往右逐个计算,但最终结果就是最后一个表达式
switch (<表达式>){
case <表达式结果整数值1>:<语句1>break;
case <表达式结果整数值2>:<语句2>break;
...
default:<语句n+1>break;
}
其中它的表达式的结果类型必须是整型的
for (<初始表达式>;<条件终止表达式>;<步长>)
{
//循环体
}
while(<条件表达式>)
{
//循环体
}
do
{
//循环体
}while(<条件表达式>);(勿漏分号)
while的条件表达式(不可省略)可以始终为真(如while(1)),但是必须要有break;防止变成死循环
for语句的<初始表达式>、<条件终止表达式>、<步长>均可省略
函数
定义:返回类型 函数名 (形式参数表) 函数体
数据类型1 变量名1,数据类型2 变量名2,…
return <返回值表达式>;
对于无返回值void型,执行返回值的语句可不写或只写return;
函数调用
递归调用是嵌套调用的一种特例
第三章 C++面向对象编程基础
面向对象编程:面向的是具有同一种属性的事物
面向对象编程的中心思想就是将看似复杂的事物提取出相似的特征,然后再处理不同的个性特征
程序运行期的基本实体——对象
实现面向对象编程的必要条件——类
类拥有自己的成员变量和成员函数,它是一些事物相同特性的体现者
类声明一般形式:
class 类名
{
//定义体
}
类对象定义一般形式:类名 对象名;
类是一个抽象的虚拟的物质,而对象是实实在在存在的一个物体
实现程序的模块化——封装
对函数的封装→函数体+参数接口
对类的封装
函数具体实现过程是看不到的,读者只需懂得外部接口如何使用
实现系统的可重用及可扩展性——继承
父类/基类→子类/派生类
同一消息为不同对象接受时产生完全不同的行为——多态
virtual(虚)和重写
对象之间沟通的途径——消息传递
对不同类成员变量的访问权限:
类型 | 关键字 | 访问权限描述 |
---|---|---|
公有成员 | public | 在其生命周期内,在任何地方都可以被访问 |
私有成员 | private | 只能被该类的其他成员访问,外部函数甚至它的子类也不可以访问 |
保护成员 | protected | 与私有成员一样,但是它可以被其子类访问 |
构造函数
创建规则:
1.名字必须跟本类的类名一模一样
2.构造函数不可以有任何类型 的返回值,即使是void也不行
3.一个类的构造函数可以被重载,即可以有多个构造函数
-
无参构造函数(即默认)
在类内被声明:类名 ();
定义体:类名::类名 () { } -
带参构造函数
被声明:类名 (<参数列表>);
定义体:类名::类名(<参数列表>){ }
默认构造函数只会执行创建对象的动作,不会给对象执行任何初始化工作
当对象一旦被创建,系统就会自动给对象分配内存空间并调用其构造函数
当一个类的对象是另一个类的成员变量时,先调用类内成员变量(另一个类对象)的构造函数,再调用自身的构造函数。
默认构造函数 / 默认参数的构造函数:如果对象没有初始值就用默认值
这两种构造函数不能同时存在
析构函数
创建规则:
1.同构造函数一样无返回类型,也无参数
2.函数是在构造函数名前加一个~逻辑非运算符
3.不可以被重载,可以在析构函数体重自行写释放资源的语句也可不写
类内被声明:~类名 ();
定义体:类名::~类名 () { }
析构函数-处理回收资源的任务
初始化对象时,先调用被调用类的构造函数,再调用主类的构造函数,而释放资源时先释放主类的,再释放被调用类的
重载构造函数:究竟调用哪个构造函数得看创建对象时的格式
复制构造函数:对于相同类定义的不同对象,可以用一个对象去构造另一个对象。此时被赋值的另一个对象调用的构造函数就称为复制构造函数
<指针变量> = new int[n] //声明n个字节的内存
delete [ ] <指针变量> //释放内存
new/delete和malloc/free的区别
1.new/delete是C++的操作符,对对象操作,是保留字,不需要头文件支持 / malloc/free是C中的函数,对内存空间操作,需要头文件库函数支持
2.new→分配内存+调用对象的构造函数 / delete→调用对象的析构函数+释放内存;malloc/free→分配和释放内存。
3.new:建立一个对象/malloc:分配一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间 / malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有类型信息的 / malloc返回的是void指针。
4.使用free释放时需要判断指针是否为NULL,delete不用
虚函数
一般在基类中进行
网友评论