SlideShare une entreprise Scribd logo
1  sur  119
Télécharger pour lire hors ligne
VC++ 程序设计
高洪臣
燕 山 大 学
2013年8月
主目录
C++基础
C++工具
熟悉Visual C++ 6.0 IDE
程序设计(with VC++ 6.0)
附录
2013年8月 VC++程序设计
2
C++基础
2013年8月 VC++程序设计
3
目录
 C++语言支持的新特性
 常量
 变量
 数据类型
 指针
 引用
 字符串
 函数
 枚举
 共用体
 结构体
 位域
 类
 运算符重载
 继承和派生
 多态性和虚函数
 输入输出流
 用typedef声明类型
 预处理命令
主目录
类
运算符重载
继承和派生
多态性和虚函数
输入输出流
用typedef声明类型
预处理命令
C++语言支持的新特性
常量
变量
数据类型
指针
引用
字符串
函数
枚举
共用体
结构体
位域
C++语言支持的新特性
年份 版本 在C语言基础上添加的新特性
1980 C with Class
类和派生类、公有和私有成员、构造与析构函数、
友元、内联函数、赋值运算符的重载
1985 C++ 1.0 虚函数、函数运算符的重载、引用、常量
1989 C++ 2.0
类的保护成员、多重继承、赋值和初始化的递归
定义、抽象类、静态成员函数、const成员函数
1993 C++ 3.0 模板、异常、类的嵌套、名字空间
2013年8月 VC++程序设计
4
注:1983年夏,“带类的C”被正式命名为“C++”
目录
常量
数值常量
字符常量
符号常量
枚举常量
2013年8月 VC++程序设计
5
目录
变量
变量名代表内存中的一个存储单元,在程序编译
连接时由系统给每一个变量分配一个地址。通过
变量名找到相应的存储单元,从中读取数据
变量名的命名规则
未对变量赋初值,其值是一个不可预测的值
初始化不是在编译时完成的(静态存储变量和外
部变量除外),而是在运行时执行本函数时赋予
初值的
2013年8月 VC++程序设计
6
目录
C++编译系统把十进制小数形式的浮点数
默认按双精度处理
浮点数在内存中以指数形式存放
若一个字符串的最后一个为“”,则它
是续行符
在计算机中负数的运算和显示以补码的
形式,
2013年8月 VC++程序设计
7
16的原码为 0001 0000,~16为 1110 1111 ,则
~16为负数。因此,~16补码为 1000 1010+1=
1000 1011=-11
数据类型
2013年8月 VC++程序设计
8
基本数据类型
整型
字符型(char)
浮点型
布尔型(bool)
无值(空类型)(void)
浮点型(float)
双精度型(double)
长双精度型(long double)
短整型(short int)
整型(int)
长整型(long int)
构造数据类型
引申数据类型
指针( * )
引用( & )
结构化数据类型
数组([ ])
枚举(enum)
共用体(union)
结构体(struct)
位域/位段
类(class)
目录
源代码(小例子)
2013年8月 VC++程序设计
9
#include<iostream>
using namespace std;
#define PI 3.1415926
int main()
{
const int NUM=6;
enum color{red,yellow,green,black,white};
cout<<green<<endl;
int a;//未初始化,值不确定
cout<<"a="<<a<<endl;
float b=1.23456789;
cout<<b<<endl;
long double c=1.23456789;
cout<<c<<endl;
cout<<sizeof(short int)<<"Byte"<<'t'
<<sizeof(int)<<"Byte"<<'t'
<<sizeof(float)<<"Byte"<<'t'
<<sizeof(double)<<"Byte"<<'t'
<<sizeof(long double)<<"Byte"<<endl;
double d=1.23f;
cout<<d<<endl;
char ch=6;
指针
一个变量的地址即该变量的指针
指针变量的值是地址(指针)
凡是存放在内存中的程序和数据都有一
个地址,可以用它们占用的那片存储单
元中的第一个存储单元的地址表示
2013年8月 VC++程序设计
10
目录
& 与 *
声明语句
*
指针的声明
&
引用的声明
执行语句
*
取指针变量所指向的对象的值
&
取指针变量的值,即地址
2013年8月 VC++程序设计
11
有关指针的数据类型
定义 含义
int i 整型变量
int *p p为指向整型数据的指针变量
int a[n] 含n个元素的整型数组a
int *p[n] 含n个指向整型数据的指针元素的指针数组p
int (*p)[n] p为指向含n个元素的一维数组的指针变量
int f( ) 返回整型值的函数f
int *p( ) 返回指向整型值的指针的函数p
int (*p)( ) p为指向返回整型值的函数的指针变量(函数指针)
int (*p[n])( ) 含n个指向返回整型值的函数的指针元素的数组p
int **p p为指向一个指向整型值的指针变量的指针变量(二级指针)
2013年8月 VC++程序设计
12
指针运算
指针变量加减一个整型值
指针变量的赋值
指针变量可以赋空值,但不能赋整数
指向同一类型的指针变量相互赋值时,后期操作可能
造成指针悬挂问题(一指针所指空间被释放,另一指
针所指空间亦被释放),在释放一指针所指的空间时,
一定要确保所有指向该空间的指针都已不再需要,以
防止指针悬挂 若要对不同类型的指针变量赋值,
应用强制类型转换
指针变量的比较
指针变量的相减,相加无意义
2013年8月 VC++程序设计
13
指针的一些注意事项
所有指针,包括访问本地堆的指针,在 Win32
下都是 32 位(4个字节)
一般的C++编译系统为每一个指针变量分配4个
字节的存储单元,用来存放变量的地址
在使用指针变量之前须先给它赋一个指向合法
具体对象的地址值,否则可能破坏有用的单元
的内容
2013年8月 VC++程序设计
14
指针的优缺点
优点
在调用函数时,若改变被调用函数中某些变量
的值,这些值能为主调函数使用,可通过函数
的调用得到多个可改变的值
可以实现动态存储分配
占内存少,运算速度快
缺点
容易产生难以发现的错误
2013年8月 VC++程序设计
15
数组与指针
一维数组与指针
int a[10]; int *p;
p=&a[0]→p=a //数组名代表第一个元素的地址
&a[i]→ a+i → p+i →&p[i] //地址
a[i]→*(a+i)→*(p+i)→ p[i] //值
二维数组与指针
int a[10][20]; int *p;
a+i→&a[i] //第i行的首地址
&a[i][j]→ a[i]+j → *(a+i)+j //地址
a[i][j]→*(a[i]+j)→*(*(a+i)+j) //值
2013年8月 VC++程序设计
16
指针数组作为main函数的形参
在dos状态下输入:
命令名 参数….
输出:??
2013年8月 VC++程序设计
17
#include<iostream>
using namespace std;
int main(int argc, char *argv[])
{
while(argc > 1)
{
++argv;
cout<<*argv<<endl;
--argc;
}
return 0;
}
动态存储分配
运算符new用来申请所需的内存
指针 = new 数据类型(初值);
运算符delete用于释放先前申请到的存储块
delete 指针; 例:int *p = new int(5);
delete p;
为数组申请动态内存:
指针 = new 数据类型[数组元素个数];
释放数组占用的动态内存空间:
delete [ ] 指针; 例:int *p = new int [10];
delete [ ]p;
对象的动态建立与释放(一般建立无名对象,主要用于动态的
数据结构,如链表)
例:Box *p = new Box(10,10,10);
delete p;
2013年8月 VC++程序设计
18
引用
int &b = a; //声明b是a的引用(别名)
声明引用时必须使之初始化
声明b是a的引用后,b不能再作为其他变
量的引用,且b和a占同一存储单元,具
有同一地址(指针变量需另外开辟空间)
主要用来作为函数参数
调用函数时,实参是变量名不是地址,
而系统向形参传递的是地址不是其值
2013年8月 VC++程序设计
19
目录
字符串
对一个字符串常量,系统会在所有字符的
后面加一个’0’作为结束符
字符串的长度比对应的字符数组(包含一
个空字符’0’)少1字节,字符串数组每一
个字符串元素不包含’0’
编译系统为每一个字符串变量(string类的
一个对象)分配固定长度的存储单元(VC
为16个字节,GCC为4个字节),存放字
符串的地址,即字符串的指针
2013年8月 VC++程序设计
20
目录
访问字符串的三种方法
字符数组,即C-string方法
字符串变量,即string方法(C++)
字符指针
2013年8月 VC++程序设计
21
指针、引用、字符串源代码
2013年8月 VC++程序设计
22
#include<iostream>
using namespace std;
int main()
{
char str[] = "Hello";
string m_str = "Hello";
string name[5] = {"zhang","li","gao"};
char *pstr = "Hello";
while(*pstr!='0')
{
cout<<*pstr;
pstr++;
}
cout<<endl;
cout<<"字符数组的长度:" <<sizeof(str) <<"Byte"<<endl;
cout<<"字符串的长度: " <<strlen("Hello")<<"Byte"<<endl;
//每一个字符串变量被编译系统分配固定长度的存储单元,VC++为16个字节
cout<<"字符串变量的长度:"<<sizeof(m_str) <<"Byte"<<endl;
cout<<sizeof(string)<<'t'<<sizeof(name)<<endl;
//一般的C++编译系统为每一个指针变量分配4个字节的存储单元,用来存放变量的地址
cout<<sizeof(pstr)<<endl;
函数
函数名代表函数的入口地址即函数的指针,
函数的指针在编译时被分配
当数组作函数形参时,C++编译系统将形
参数组名一律作为指针变量来处理
实参数组名代表一个固定的地址,或说是
指针常量,而形参数组名为指针变量
根据函数能否被其他源文件调用,将函数
区分为内部函数和外部函数
2013年8月 VC++程序设计
23
目录
函数参数传递
传值
变量名
实参和形参均为变量名
指针
实参为变量指针
形参为指针变量
传址
引用
实参为变量名
形参为引用类型
2013年8月 VC++程序设计
24
显然,使用引用比使用指针变量简单、直观、方便
指针变量作函数参数,调用函数时不
会改变实参指针变量的值,但可改变
实参指针变量所指向的变量的值
内置函数
在编译时将调用的函数的代码直接嵌入到主调
函数中,而不是将流程转出去,这种嵌入到主
调函数中的函数称为内置函数(inline function),
又称内嵌(内联)函数
在函数首行的左端加一个关键字inline,可在声
明和定义时同时写,也可只在其中一处写,效
果相同
可节省运行时间,但增加了目标程序的长度
只有那些规模小而又被频繁调用的简单函数,
才适合声明为inline函数;而且对函数作inline
声明对编译系统只是建议性的
2013年8月 VC++程序设计
25
函数重载、覆盖与隐藏
函数重载:参数类型、参数个数和参数顺序三
者必须至少有一种不同,函数返回值可同可不
同;处理的是同一层次上的同名函数问题
函数覆盖:发生覆盖的两个函数要分别位于派
生类和基类中,基类函数须是虚函数,函数名
与参数列表须完全相同
函数隐藏:派生类函数与基类函数的函数名和
参数列表完全相同,基类函数不是虚函数;派
生类函数与基类函数同名,但参数列表不同(不
管基类函数是否为虚函数);从而在派生类中隐
藏了基类的同名函数;用作用域限定符可调用
基类中被隐藏的函数
2013年8月 VC++程序设计
26
函数源代码
2013年8月 VC++程序设计
27
枚举
enum weekday{sun, mon, tue, wed, thu, fri, sat};//声明
weekday workday, week_end; //定义枚举变量
在C++中允许不写enum(一般也不写),花括号中的
称为枚举元素或枚举常量,C++编译按定义时的顺
序对它们赋值为0,1,2,3,…
可在声明枚举类型时指定枚举元素的值
enum weekday{sun=7, mon=1, tue, wed, thu, fri, sat};
编译系统自动按顺序加1,则sat为6
一个整数不能直接赋给一个枚举变量,应先强制类
型转换,例:workday = weekday(2); //C++风格形式
2013年8月 VC++程序设计
28
目录
共用体(联合)
不能引用共用体变量,
只能访问共用体变量
中最后一次被赋值的
成员
共用体变量的地址和
它的各成员的地址都
是同一地址,共用体
变量所占的内存长度
等于最长的成员的长
度
2013年8月 VC++程序设计
29
先声明,后定义
union data{ };
data a, b;
声明时定义
union data{ }a, b;
不出现共用体类型名
直接定义
union{ }a, b;
目录
结构体
每个成员也称结构体
的一个域,成员表列
亦称域表
成员可为结构体变量;
C中成员只能是数据,
C++成员可为函数
只能对变量中的各成
员分别进行输入输出
编译时只为结构体变
量分配空间
2013年8月 VC++程序设计
30
先声明,后定义
struct Student{ };
Student stud1; 或
struct Student{ };
struct Student stud;
声明时定义
struct Student{ }stud;
不出现类名直接定义
struct{ }stud;
目录
位段(位域)
在一个结构体中以位为单位指定其成员所占的内存长度,这
种以位为单位的成员称为位段或位域 (节省内存)
其成员的类型必须指定为unsigned或int型
若某一位段要从另一字开始存放,可用以下形式定义:
unsigned a:1;
unsigned b:2;
unsigned :0;
unsigned d:5;
可定义无名位段 : unsigned :2; (这两位空间不占用)
一个位段必须存储在同一个存储单元中,不能跨两个单元;
位段的长度不能大于存储单元的长度,也不能定义位段数组
若赋的值超过允许范围则自动取其低位数据
可在表达式中引用,它会被系统自动转换为整型数
2013年8月 VC++程序设计
31
占一个存储单元
另一存储单元
目录
枚举、共用体、结构体、位段源代码
2013年8月 VC++程序设计
32
#include<iostream>
using namespace std;
//声明枚举类型
enum weekday{sun=7, mon=1, tue, wed, thu, fri, sat};
struct Student //结构体
{
int age;
char name[20];
union P //共用体
{
int grade;
char position[10];
}category;
unsigned a:2;//位段
unsigned b:3;
};
int main()
{
weekday workday;//定义枚举变量
workday=weekday(1);//C++风格的强制类型转换格式
cout<<workday<<endl
<<wed<<endl;
类
类是对象的抽象,不占存储空间
对象是类的实例,占用存储空间
一个对象所占的空间的大小只取决于其中的数据
成员所占的空间,而成员函数不占用对象的存储
空间
信息隐蔽 = 类的公用接口与私有实现的分离
把类的声明(包含成员函数的声明)放到一个头文
件中;把成员函数的定义放到另一文件中,单独
编译,从而不重复编译
类库 = 类声明头文件 +
已编译过成员函数的定义的目标文件
2013年8月 VC++程序设计
33
目录
类的声明与对象的定义
先声明,后定义
class Student{ };
Student stud1; 或
class Student{ };
class Student stud;
声明时定义
class Student
{ }stud;
不出现类名直接定义
class { }stud;
在类中,系统默认声明的成员
为私有成员;在结构体中,系
统默认声明的成员为公有成员
声明类时不能初始化数据成员
公有成员函数为类的对外接口
须在类内声明类函数,最好在
类外定义类函数,类外定义函
数时须指明作用域
类内定义的成员函数被隐含的
指定为内置函数
2013年8月 VC++程序设计
34
对象成员对象的访问
Student stud, *p, &stud1 = stud, stu[3]; p = &stud;
对象名.成员名
stud.display( )
指向对象的指针→成员名
P→display( ); 或 (*p).display( );
对象的引用.成员名
stud1.display( );
对象数组元素.成员名
stu[0].display( );
2013年8月 VC++程序设计
35
构造函数
构造函数与类同名,无返回值(无需声明类型),一般声明为public
主要用来对对象初始化,对象建立时由系统(而不是用户)调用构造函数
一个类只能有一个默认构造函数(缺省构造函数)
不带参数的构造函数
Box( ){height=h; width = w; length = len;}
带参数的构造函数
声明Box(int, int, int);
定义Box::Box(int h, int w, int len) {height=h; width = w; length = len;}
带默认参数的构造函数(形参名可省略)
声明Box(int h=10, int w=10, int len=10); 或 Box(int =10,int=10,int=10);
定义Box::Box(int h, int w, int len) {height=h; width = w; length = len;}
用参数初始化表对数据成员初始化
Box(int h, int w, int len):height(h),with(w),length(len){ }
复制构造函数
只有一个参数——对象的常引用
2013年8月 VC++程序设计
36
析构函数
~Box( ){ };
析构函数与类同名,无返回值(类型),无参数
一个类只能有一个析构函数
当对象的生命周期结束时,自动执行析构函数
对一个对象来说,析构函数是最后一个被调用
的成员函数
其作用并不是删除对象,而是在撤销对象占用
的内存之前完成一些清理工作
调用析构函数的顺序与构造函数相反
2013年8月 VC++程序设计
37
对象指针
指向对象的指针
对象空间的起始
地址
类名 *对象指针
名
Box *p, a;
p = &a;
指向对象成员的指针
对象成员空间的起
始地址
指向对象数据成员
的指针
int *p1;
p1 = &a1.width;
指向对象成员函数
的指针
void (Box::*p2)( );
P2 = &Box::volume;
(&在C程序中可省)
2013年8月 VC++程序设计
38
this指针
当前被调用的非
静态成员函数所
在对象的起始地
址,即指向本类
对象的指针
默认隐式使用,
作为参数传给非
静态类函数,也
可显示使用
类和对象源代码(一)
2013年8月 VC++程序设计
39
#include<iostream>
using namespace std;
class Box
{
int length, width, height;//私有成员
public:
Box();
//用参数初始化表对数据成员初始化
Box(int len, int w, int h):length(len),width(w),height(h)
{
}
~Box()
{
}
int volume();
};//分号不可少
Box::Box()
{
length = 5;
width = 5;
height = 5;
}
int Box::volume()
{
共用数据的保护
常对象
const Box b(10,10,10);
Box const b(10,10,10);
只能调用其中的常成员函数,
数据成员值不被修改
常对象成员
常数据成员
const int width;
只能通过构造函数的参数初
始化表进行初始化,不能被
赋值
常成员函数
int volume( ) const;声明定义加
只能引用本类的数据成员,
而不能修改它们
指向对象的常指针
Box * const p = &b1;
常指针变量的值不能改变,
但可改变其指向对象中数据
成员的值
常被用作函数形参
指向常对象的指针变量
const Box *p = &b2;
除了可指向常对象,还可指
向非const的对象;常对象只
能被指向常对象的指针指向
对象的常引用
const Box &box = b3;
常被用作函数形参
2013年8月 VC++程序设计
40
静态成员
静态数据成员
stactic int height;
不占用对象的存储空间,
不属于某对象,在内存中
只占一空间
只能在类体外初始化,不必
在初始化语句中加static
int Box::height = 10;
若未对其赋初值,则编译
系统自动赋予初值0
可通过类名引用
cout<<Box::height<<endl;
静态成员函数
static int volume( );
不是为了对象之间的沟通,
而是为了能处理静态数据
成员
无this指针
主要访问静态数据成员,
而访问非静态成员
2013年8月 VC++程序设计
41
若想在同类的多个对象
之间实现数据共享,也
不要用全局对象,可以
用静态的数据成员???
对象的赋值与复制
对象的赋值
Box box1, box2;
box2 = box1;
同类对象之间
通过成员复制完成,即将
一个对象的成员值一一复
制给另一对象的对应成员
对一个已存在的对象赋值
对象的复制
Box box2(box1);
用一个已有的对象快速地
复制出多个完全相同的对
象
建立对象时调用复制构造
函数
从无到有地建立一个新对
象,并使它与一个已有的
对象(包括对象的结构和成
员的值)完全相同
2013年8月 VC++程序设计
42
友元
友元函数
一个类的友元函数可以访
问这个类的私有成员,一
个函数可以被多个类声明
为友元函数
普通函数声明为友元函数
friend int display(Date &);
友元成员函数
friend int Box::
volume(Rect &)
友元类
friend 类名;
class A
{
public:
friend B
}
友元的关系是单向的而不
是双向的
友元的关系不能传递
2013年8月 VC++程序设计
43
类和对象源代码(二)
2013年8月 VC++程序设计
44
#include<iostream>
using namespace std;
class Date;//对Date类的提前引用声明
class Time
{
public:
Time(int, int, int);
void display(Date &);//形参为对象的引用
private:
int hour,minute,second;
};
class Date
{
public:
Date();
Date(int, int, int);
//声明Time类中的display函数为Date类的友元成员函数
friend void Time::display(Date &);
private:
int year,month,day;
};
Time::Time(int h, int m, int s):hour(h),minute(m),second(s)
{
}
运算符重载
实质上是函数重载
函数类型 operator运算符名称(形参表列){};
C++不允许用户自己定义新的运算符,只能对已有的C++
运算符进行重载
重载不能改变运算符运算对象的个数、优先级别、结合
性,不能有默认的参数,参数至少有一个类对象(其引用)
C++约定:若在前置自增(自减)运算符重载函数中增加一
个int型形参,就是后置(自减)运算符函数
只能将重载“>>”和“<<”的函数作为友元函数或普通
的函数,而不能将他们定义为成员函数
2013年8月 VC++程序设计
45
目录
不同类型数据间的转换(赋值兼容)
标准类型数据间的转换:
隐式转换;显示转换:类型名(数据) / (类型名)数据
用转换构造函数进行类型转换
用类型转换构造函数进行类型转换
2013年8月 VC++程序设计
46
继承和派生
继承:一个新类从已有的类那里获得其已有特性
派生:从已有的类(基类)产生一个新的子类(派生类)
继承与组合:在一个类中以另一个类的对象作为数据成员
继承分单继承和多重继承,派生分一级派生和多级派生
继承方式:公用、保护、私有
访问属性:公用、保护、私有、不可访问
派生类的成员:基类的全部成员(不包括构造和析构函数)+
自己增加的成员
私有成员只能被本类的成员函数访问,保护成员可被派生类
的成员函数引用
类的成员在不同的作用域中有不同的访问属性
2013年8月 VC++程序设计
47
目录
2013年8月 VC++程序设计
48
基类成员 在公用派生类中 在私有派生类中 在保护派生类中
私有成员 不可访问 不可访问 不可访问
公用成员 公用 私有 保护
保护成员 保护 私有 保护
派生类成员 在派生类中 在派生类外部 在下层公用派生类中
公用成员 可以 可以 可以
保护成员 可以 不可以 可以
私有成员 可以 不可以 不可以
不可访问的成员 不可以 不可以 不可以
基类成员在派生类中的访问属性
派生类中的成员的访问属性
派生类的构造与析构函数
派生类构造函数名(总参数表列):基类构造函数名(参
数表列),…,子对象名(参数表列),…
{ 派生类新增数据成员的初始化语句 }
派生类构造函数的执行顺序:基类、子对象、派生类
多重继承中的初始化是按基类表中的说明顺序进行的
析构函数与构造函数相反
若基类未定义构造函数或定义了未带参数的构造函数,
则在派生类中可不写基类构造函数;在调用派生类构
造函数时系统会自动首先调用基类默认的构造函数
2013年8月 VC++程序设计
49
多重继承引起的二义性问题
继承的成员同名而产生二义性(ambiguous)问题
① 两个基类有同名成员
② 两个基类和派生类三者都有同名成员
③ 派生类的两个基类派生于同一基类
使用作用域限定符
虚基类
使得在继承间接基类时只保留一份成员
声明: class 派生类名:virtual 继承方式 基类名
为保证虚基类在派生类中只继承一次,应当在该基类的
所有直接派生类中将其声明为虚基类;在最后的派生类
中要对其直接基类和虚基类进行初始化;C++编译系统
只执行最后的派生类对虚基类的构造函数的调用
2013年8月 VC++程序设计
50
解决方案
基类与派生类的转换
公用派生类具有基类的全部功能,只有公用派生类才
是基类真正的子类型,子类型关系是单向的、不可逆
的
赋值兼容:不同类型数据之间的自动转换和赋值
① 派生类对象可向基类对象赋值
② 派生类对象可代替基类对象的引用进行赋值或初始化
A a1; B b1; A& r=b1; (A& r=a1; r=b1;)
r只是b1中基类部分的别名,与b1中基类部分共享同一
段存储单元,r与b1具有相同的起始地址
③ 若函数参数是基类对象或基类对象的引用,相应实参
可用子类对象
④ 派生类对象的地址可赋给指向基类对象的指针变量
2013年8月 VC++程序设计
51
继承与派生源代码
2013年8月 VC++程序设计
52
#include<iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(string nam,int a,char s):name(nam),age(a),sex(s)
{
}
void show()
{
cout<<"name:" <<'t'<<name <<endl
<<"age:" <<'t'<<age <<endl
<<"sex:" <<'t'<<sex <<endl;
}
protected:
string name;
int age;
char sex;
};
class Teacher:virtual public Person//声明Person为公用继承的虚基类
{
public:
多态性和虚函数
多态性:用一个函数名调用具有不同内容(功能)的函数;不
同对象对同一消息有不同的响应方式(一个接口,多种方法)
从系统实现的角度,多态性分为:静态多态性(编译时的多
态性)和动态多态性(运行时的多态性,通过虚函数实现)
关联:调用具体的对象的过程(把一个函数名与一个对象捆
绑在一起)
静态(早期)关联:通过对象名调用虚函数,在编译时即可确
定其调用的函数属于哪个类
动态(滞后)关联:通过基类指针调用虚函数,在运行阶段把
虚函数和类对象捆绑在一起
2013年8月 VC++程序设计
53
目录
虚函数
类外定义虚函数时不必加virtual
派生类中定义的同名函数:函数名、类型、参数个数、
参数类型须与虚函数相同;当一个成员函数被声明为虚
函数后,其派生类的同名函数都自动成为虚函数
先用基类对象指针指向同一类族中某一对象,即可调用
该对象中的同名函数
函数重载处理的是同一层次上的同名函数问题,而虚函
数处理的是不同派生层次上的同名函数问题(函数覆盖)
当一个类有虚函数时,编译系统会为该类构造一个虚函
数表(一个指针数组),存放每个虚函数的入口地址
构造函数不能声明为虚函数;若基类的析构函数声明为
虚函数,则其所有派生类的析构函数均为虚函数
2013年8月 VC++程序设计
54
纯虚函数与抽象类
纯虚函数:virtual 函数类型 函数名(参数表列)=0;//声明语句
无函数体;“=0”并不表示返回值为0,只是形式;不具备
函数的功能,不能被调用
若在派生类中未对该函数定义,则在派生类中仍为纯虚函数
抽象类:不用来定义对象,只作为一种基本类型用作继承的类
可定义指向抽象类对象的指针变量,通过指针调用具体派生
类的虚函数
凡是包含纯虚函数的类都是抽象类,抽象基类是本类族的公
共接口
2013年8月 VC++程序设计
55
多态性与虚函数源代码
2013年8月 VC++程序设计
56
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student(string nam,int a,char s,float
sco):name(nam),age(a),sex(s),score(sco)
{
}
// virtual void display() = 0;//纯虚函数
virtual void display()//虚函数
{
cout<<"name:" <<'t'<<name <<'n'
<<"age:" <<'t'<<age <<'n'
<<"sex:" <<'t'<<sex <<'n'
<<"score:"<<'t'<<score<<'n';
}
protected:
string name;
int age;
char sex;
float score;
输入输出流
标准I/O:键盘输入数据,显示到屏幕上
文件I/O:以外存磁盘文件为输入输出对象
串I/O:对内存中指定的空间(通常为字符数组,
利用该空间可存储任何信息)进行输入输出
2013年8月 VC++程序设计
57
目录
标准输入输出
标准输出流
cout,cerr,clog流
格式输出
使用控制符控制输出格式:头文件iomanip
使用流对象的成员函数:格式标志在类ios中被定义为枚举
值
用流成员函数put输出字符
标准输入流
cin流
用流成员函数输入字符:无参、1个、3个参数的get,getline
Istream类的其他成员函数
2013年8月 VC++程序设计
58
文件输入输出
2013年8月 VC++程序设计
59
字符串输入输出
2013年8月 VC++程序设计
60
用typedef声明类型
常把用typedef声明的
类型用大写字母表示
可声明各种类型,但
不能定义变量
只是对已存在的类型
增加一个类型名,而
未创造新的类型
有利于程序的通用和
移植
声明新类型的方法:
(以数组类型为例)
1. 先按定义数组形式书写:
int array[8];
2. 将变量名换成自己指定的类
型名:
int ARR[8];
3. 在前面加上typedef,得到:
typedef int ARR[8];
4. 用来定义数组变量:
ARR a;
(a是包含8个整型元素的数组)
2013年8月 VC++程序设计
61
目录
预处理命令
文件包含
一源文件将另一文件的全
部内容包含进来;被包含
文件修改后,凡包含此文
件的文件都要重新编译
#include<文件名>
在系统目录查找
#include”(路径和)文件名”
若无绝对路径,则默认用
户当前目录文件;先用户
目录,后系统目录
条件编译
#ifdef/#ifndef/#if 标识符
程序段1
#else
程序段2
#endif
2013年8月 VC++程序设计
62
目录
宏定义
不带参数的宏定义
#define 宏名 字符串
#undef 宏名
终止宏定义的作用域
宏名一般习惯大写
可引用已定义的宏名,层
层置换
宏展开:在预编译时将宏
名替换成字符串的过程;
只做简单替换,不做正确
性检查
带参数的宏定义
#define 宏名(参数表) 字符串
在宏名与带参数的括号之间
不应加空格
宏名和参数均无类型,只是
一个符号代表
宏替换不分配内存空间,不
占运行时间,只占编译时间;
函数调用则占运行时间(分
配单元、保留现场、值传递、
返回)
2013年8月 VC++程序设计
63
typedef与预处理命令源代码
2013年8月 VC++程序设计
64
#include<iostream>
using namespace std;
typedef int ARR[2]; //用typedef声明数组类型
#define MAX(x,y) x>y?x:y //带参数的宏定义
int main()
{
int max;
ARR a;
a[0]=1;
a[1]=2;
max=MAX(a[0],a[1]);
#ifdef MAX
cout<<"max="<<max<<endl;
#else
cout<<"MAX(x,y) is not defined! "<<endl;
#endif
return 0;
}
C++工具
2013年8月 VC++程序设计
65
主目录
目录
 模板
 异常处理
 命名空间
 运行时类型识别
 C++开发软件
模板
异常处理
命名空间
运行时类型识别
C++开发软件
模板
函数模板
template<typename T>
通用函数定义 或
template<class T>
通用函数定义
类型参数可以不止一个
template<class T1,class T2>
只适用于函数体相同、函
数的参数个数相同而类型
不同的情况
类模板
template<class或typename T>
通用类定义
类模板名<实际类型名>
→实际类名
类外定义成员函数:
要多加一行template<class
T>
类型参数可以不止一个,在定
义对象时分别代入实际类型名
模板可有层次,一个类模板可
作为基类,派生出派生模板类
2013年8月 VC++程序设计
66
目录
模板源代码
2013年8月 VC++程序设计
67
#include<iostream>
using namespace std;
//声明类模板,Box为类模板名
template<typename TYPE> //<>中的为模板形参表
class Box//类声明
{
TYPE length, width, height;
public:
Box();
Box(TYPE len, TYPE w, TYPE h):length(len),width(w),height(h)
{
}
~Box()
{
}
TYPE volume();
};
//类外定义成员函数
template<typename TYPE>
Box<TYPE>::Box()
{
length = 5;
异常处理
程序中常见的两大错误:语法(编译)错误和运行错误
异常处理:对运行时出的差错及其他例外情况的处理
C++异常处理机制 = 检查(try) + 抛出(throw) + 捕捉(catch)
在一个try-catch结构中,可只有try块而无catch块;只能有一
个try块,但却可有多个catch块;其语句须用花括号括起来;
二者之间不能插入其他语句
catch后的圆括号中一般只写类型名,也可指定变量名;还
可用删节号“…”(可捕捉任何类型的信息,一般在最后)
catch (double){}; catch (double a){}; catch (…){};
throw可以不包括表达式(表示不抛出这个异常,请上级处
理);若其抛出的异常信息找不到与之匹配的catch块,则系
统会调用一个系统函数terminate,使程序终止运行
2013年8月 VC++程序设计
68
目录
在函数声明时指定异常
列出可能抛出的类型
int area( ) throw(int);
未列出可能抛出的类型,
可抛出任何类型的异常
信息
int area( ) throw a;
无参数,不能抛出异常
int area( ) throw();
异常处理中处理析构函
数
2013年8月 VC++程序设计
69
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student(int n,string nam)
{
cout<<"constructor--"<<n<<endl;
num = n;
name= nam;
}
~Student()
{
cout<<"destructor--"<<num<<endl;
}
void get_data();
private:
int num;
string name;
};
void Student::get_data()
{
if(0==num)
throw num;//抛出异常信息
else
cout<<num<<'t'<<name<<endl;
cout<<"in get_data()"<<endl;
}
命名空间
名字冲突:同一作用域中有两个或多个同名的实体
命名空间:为解决名字冲突而由程序设计者命名的内存区域
其实体:变量、常量、函数、结构体、类、模板、命名空间
简化使用命名空间成员的方法:
用空间别名:namespace Television{}namespace TV= Television;
使用using命名空间成员名:using ns1::Student;
using声明的有效范围是从using语句始到using所在的作用域止
使用using namespace命名空间名:using namespace ns1;
无名的命名空间:namespace{…}
其成员使用时无法用空间名限定,作用域为空间所在的文件
(用static声明一个函数,也使该函数的作用域限于本文件)
C++标准库中的类和函数是在std中声明的
2013年8月 VC++程序设计
70
目录
命名空间源代码
2013年8月 VC++程序设计
71
#include<iostream>
using namespace std;//使用using namespace命名空间名
namespace namespace1//命名空间ns1
{
const double PI=3.1415926;//常变量
double area(double r)
{
cout<<"ns1::area() called."<<'0';
return PI*r*r;
}
class Box
{
int length, width, height;
public:
Box(int len, int w, int h):length(len),width(w),height(h)
{
}
int volume()
{
return width * height * length;
}
运行时类型识别
2013年8月 VC++程序设计
72
目录
C++开发软件
公司 工具名称 推出年份 系统平台
Microsoft
VC++ 1.0 1992
VC++ 6.0 1998 Windows 98/NT/XP
VC++ 11.0
Visual C++ 2010
2010 Windows 7、Windows 8
Borland C++ Builder Windows
GNU GCC Windows、Unix、Unix-Like
2013年8月 VC++程序设计
73
注:VC6.0与Win7不兼容,VC2010目前最稳定
目录
熟悉
Visual C++ 6.0 IDE
2013年8月 VC++程序设计
74
主目录
目录
 VC++ 6.0主界面
 编辑代码时常用的技巧
 VC++的帮助功能
 VC++6.0的文件类型
VC++ 6.0主界面
编辑代码时常用的技巧
VC++的帮助功能
VC++6.0中的文件类型
Visual C++ 6.0 主界面
2013年8月 VC++程序设计
75
工
作
区
窗
口
输出窗口
代
码
编
辑
区
工
具
栏
标题栏
菜
单
栏
状态栏
目录
菜单栏
2013年8月 VC++程序设计
76
工具栏
2013年8月 VC++程序设计
77
链接工具栏 流程图
2013年8月 VC++程序设计
78
C++程序运行原理
调试工具栏
2013年8月 VC++程序设计
79
工作区窗口
2013年8月 VC++程序设计
80
类或结构体
公有成员函数
保护成员函数
私有数据成员
公有数据成员
保护数据成员
全局函数/变量
编辑代码时常用的一些技巧
在某个标识符上双击→选中此标识符
Ctrl+C复制 Ctrl+X剪切 Ctrl+V粘贴
Ctrl+F在当前文档中查找
F1帮助(在MSDN Library检索)
Alt+F8 整齐、规范化代码
工作区窗口中,在某个标识符上双击直接
定位到其定义的位置
利用好快捷菜单
2013年8月 VC++程序设计
81
目录
VC++的帮助功能
2013年8月 VC++程序设计
82
MSDN
Library
MSDN与MSDN Library
目录
VC++ 6.0中的文件类型
2013年8月 VC++程序设计
83
目录
程序设计
(with VC++ 6.0)
2013年8月 VC++程序设计
84
主目录
程序设计
DOS-LIKE程序
Win32 Console Application
入口函数main( )
可以访问部分windows API
不能运行在DOS下
一种DOS-LIKE程序
Windows窗口程序
MFC
封装了windows API的类库
Win32 Application
标准
入口函数WinMain( )
2013年8月 VC++程序设计
85
Windows程序
标准库函数
Windows API
Platform SDK
MFC
Windows
Forms
易懂,有助于理解
Windows工作原理
,但工作量大
复杂,代码可读性
差,但工作量小
建立
Win32 Console Application
2013年8月 VC++程序设计
86
选择项目类型
显示项目信息
1、创建工程项目
2013年8月 VC++程序设计
87
启动VC++ 6.0 建立工程项目
创建项目完成
生成一个与项目同名的文件夹,并在其下生成两个与
项目同名、扩展名分别为dsp(工程项目文件,用于存
储当前项目的设置及其他相关信息)和dsw(工作区文
件,包含工作区的定义和项目所包含文件的信息)的文
件,以及一个名为Debug的子文件夹(用于存放编译、
链接过程中生成的中间文件和最终生成的可执行文件)
2013年8月 VC++程序设计
88
2、添加源文件或头文件
一个工程项目可以包含多个源文
件和头文件,但含有main()函数的源
文件只能有一个
3、编辑、编译、链接
4、运行程序
在DOS下编译、运行C/C++程序
2013年8月 VC++程序设计
89
利用MFC
创建Windows窗口应用程序
2013年8月 VC++程序设计
90
创建MFC程序框架
2013年8月 VC++程序设计
91
1 2 3
4
5
6
7
8
9
0
√ √ √
√
√
一般情况下的选择
窗口
所有窗口的消息都伴随着一个该窗口的
句柄
2013年8月 VC++程序设计
92
窗口相关的类及其成员
CWnd
m_hWnd
2013年8月 VC++程序设计
93
消息
2013年8月 VC++程序设计
94
MFC相关知识
在MFC中,对资源的操作都是通过一个
与资源相关的类来完成的
2013年8月 VC++程序设计
95
简单绘图
为了绘图操作,必须获得一个设备描述表
视类窗口只有客户区;框架窗口(视类窗口的
父窗口)既有客户区(菜单栏一下的部分),又
有非客户区
在程序中,当构造一个GDI对象后,必须选入
设备描述表,他才会在以后的操作中生效;完
成绘图操作后,要把先前的GDI对象选入设备
描述表,以便恢复先前的状态
设备描述表中默认的画笔为黑色,画刷为白色
2013年8月 VC++程序设计
96
简单绘图相关的类及其成员
CWnd
GetDC( )
ReleaseDC( )
GetParent( )
GetDesktopWindow( )
CDC
CClientDC
CWindowDC
m_hDC
MoveTo( ) LineTo( )
SelectObject( )
CPen
CBrush
GetStockObject( )
FromHandle( )
CBitmap
LoadBitmap( )
CreatBitmap( )
CRect
GetTextMetrics( )
FillRect( )
Rectangle( )
2013年8月 VC++程序设计
97
其对象只能访
问窗口客户区
其对象可以访
问窗口客户区
和非客户区
画笔的宽度小于等于1
时,虚线线型才有效
将画刷句柄转
化为画刷对象
菜单
弹出式菜单:Pop-up类型,不能响应命令
菜单项:可通过资源ID和位置索引访问
子菜单:没有资源ID,只能通过索引号访问
标记菜单:前面带一个对号 √
图形标记菜单
默认菜单项:以粗体显示 ,一个子菜单只能
有一个
分隔栏:在子菜单中占索引位置
快捷菜单:上下文菜单、右键菜单
动态添加菜单
2013年8月 VC++程序设计
98
菜单编程相关的类及其成员
CWnd
GetMenu( )
SetMenu( )
CMainFrame
m_bAutoMenuEnable
CCmdUI
m_nID
m_nIndex
Enable( )
SetCheck( )
SetText( )
ClientToScreen( )
GetSystemMetrics( )
CMenu
GetSubMenu( )
CheckMenuItem( )
SetDefaultItem( )
SetMenuItemBitmaps( )
EnableMenuItem( )
Detach( )
LoadMenu( )
TrackPopupMenu( )
CreatMenu( )
AppendMenu( )
InsertMenu( )
DeleteMenu( )
2013年8月 VC++程序设计
99
可以得到图形标
记菜单上显示的
位图的尺寸
将客户区坐标转
化为屏幕坐标
使用、禁用或变
灰显示菜单项
=FALSE
移除或加载菜单
将菜单句柄与菜单对象分离
显示快捷菜单
菜单编程的一些注意事项
代码放在框架类(CMainFrame)的OnCreate函数最后
在设置窗口菜单时,如果定义的是局部菜单对象,
则一定要在调用SetMenu函数之后,立即调用菜单
对象的Detach函数将菜单对象与菜单句柄分离
若把工具栏上的一个工具按钮与菜单栏中的某个菜
单项关联,只要将它们的ID设置为同一个标识即可
UPDATE_COMMAND_UI消息的响应只能用于菜
单项,不能应用于弹出式菜单
在显示快捷菜单时顶级菜单是不出现的
2013年8月 VC++程序设计
100
改变菜单项状态:
UPDATE_COMMAND_UI消息,
m_bAutoMenuEnable = true;
通过GetMenu( )一级级查找,修改。
m_bAutoMenuEnable = false;
动态添加删除菜单:
通过GetMenu( )一级级查找,更改
响应单击菜单命令:
ON_COMMAND消息
2013年8月 VC++程序设计
101
为对话框添加菜单栏
对话框的属性→Menu→选择菜单栏ID
CMenu对象→LoadMenu( )→SetMenu( )
2013年8月 VC++程序设计
102
亦适用于其他MFC框架
添加右键(上下文)菜单
WM_RBUTTONDOWN
WM_CONTEXTMENU
CMenu → LoadMenu( ) → GetSubMenu( )
→ TrackPopupMenu( )
2013年8月 VC++程序设计
103
控件
在MFC中,所有的控件类都是由CWnd类派生
来的,因此控件也是窗口,实际上,控件通常
是作为对话框的子窗口建立的
静态文本控件在默认状态下不发送通告消息;
为了使其能响应鼠标单击消息,需改变其ID并
在它的属性对话框中选中Notify选项
当一个单选按钮设置了Group选项后,随后的
单选按钮就和此按钮同属一组了,直到遇到下
一个(按照Tab顺序)具有Group属性的控件为止
在MFC编程中,对控件的操作都是通过相关的
MFC类来完成的
2013年8月 VC++程序设计
104
常用控件及其对应的控件类
控件 功能 对应控件类
静态文本框(Static Text) 显示文本,一般不能输入信息 CStatic
图像控件(Picture) 显示位图、图标、方框和图元文件,不输入 CStatic
编辑框(Edit Box) 输入并编辑文本(单行或多行) CEdit
按钮(Button) 响应用户的输入,触发相应的事件 CButton
复选框(Check Box) 选择标记,选中、未选中和不确定三种状态 CButton
单选按钮(Radio Button) 从两个或多个选项中选择一个 CButton
组框(Group Box) 主要用来将相关的控件组织在一起 CButton
列表框(List Box) 显示一个列表,可以从其中选择一项或多项 CListBox
组合框(Combo Box)
编辑框和列表框的组合,分为简易式、下拉
式和下拉列表式
CComboBox
滚动条(Scroll Bar)
从一个预定义范围中迅速而有效地选取一个
整数值
CScrollBar
2013年8月 VC++程序设计
105
控件相关的类及其成员
CButton
Creat( )
ShowWindow( )
DestroyWindow( )
CListBox
AddString( )
CComboBox
AddString( )
GetCurSel( )
GetLBText( )
2013年8月 VC++程序设计
106
对话框
模态对话框
当其显示时,程序会暂停
执行,直到关闭这个模态
对话框后才能继续执行程
序中的其他任务
创建时需要调用成员函数
DoModal(创建并显示一
个对话框),其返回值将
作为函数EndDialog(关
闭模态对话框)的参数
可以使用局部对象
点击【OK】按钮时,对话
框消失且其对象销毁
非模态对话框
当其显示时,允许转而执
行程序中的其他任务,而
不用关闭这个对话框
创建时需要调用成员函数
Creat,还要调用成员函数
ShowWindow将对话框显示
出来
可以把对话框对象定义为
视类的成员变量或指针,
不要将其定义为局部对象
点击【OK】按钮时,对话
框消失但对象未毁而隐,
需调用DestroyWindow销毁
2013年8月 VC++程序设计
107
对话框相关的类及其成员
CWnd
DoDataExchange( )
UpdateData( )
GetDlgItem( )
GetWindowText( )
SetWindowText( )
GetDlgItemText( )
SetDlgItemText( )
GetDlgItemInt( )
SetDlgItemInt( )
SendDlgItemMessage( )
CDialog
DoModal( )
EndDialog( )
atoi( ) itoa( )
GetFocus( )SetFocus( )
GetWindowRect( )
SetWindowPos( )
SetWindowLong( )
GetNextWindow( )
GetWindow( )
GetNextDlgTabItem( )
2013年8月 VC++程序设计
108
三
种
获
得
窗
口
句
柄
的
方
法
按
Tab
顺
序
依
次
查
找
具
有
Tab
Stop
属
性
的
控
件
七种访问对话框控件的方式
GetDlgItem( )→Get(Set)WindowText( )
GetDlgItemText( )/SetDlgItemText( )
GetGlgItemInt( )/SetGlgItemInt( )
将控件与整型变量相关联
将控件与控件变量相关联
SendMessage( )
SendDlgItemMessage( )
2013年8月 VC++程序设计
109
对话框编程的一些注意事项(一)
DoDataExchange( )函数内部实现了对话框控件
与类成员变量的关联,通过函数UpdateData( )
来调用
前缀DDX_为的函数------对话框数据交换
前缀DDV_为的函数------对话框数据校验
程序运行时,当对话框及其上的子控件创建完
成将要显示之前会发送WM_INITDIALOG消息。
因此在此消息的响应函数OnInitDialog( )中修
改编辑框控件的窗口过程比较合适
2013年8月 VC++程序设计
110
对话框编程的一些注意事项(二)
对话框的OK和Cancel按钮的ID分别为IDOK和
IDCANCEL,默认的消息响应函数为OnOK和
OnCancel
当在对话框中按下回车键时,Windows将查看
对话框中是否存在指定的默认按钮。若有,就
调用默认按钮单击消息的响应函数;若无,就
会调用虚拟的OnOK函数,即使对话框中未包
含默认的OK按钮
默认情况下,所有的编辑框控件和按钮控件都
设置了Tab Stop属性。若设置了此属性,则在
对话框按下Tab键后,输入焦点可以转移到此
控件上
2013年8月 VC++程序设计
111
属性表单与向导
一个属性表单由一个或多个属性页组成
属性表单是属性页的父窗口
为创建属性表单,先需创建属性页,后者对应
的MFC类是从CDialog派生来的CProperPage(属
性页窗口即对话框窗口)
CProperSheet类从CWnd类派生而来
属性页的标题即选项卡名称
可在程序中先增加一个普通对话框资源,修改
其属性,使其符合属性页资源的要求,然后把
它当做属性页资源使用
插入属性页资源时默认语言是英语
2013年8月 VC++程序设计
112
属性表单创建步骤
1. 创建CProperSheet类
2. 在属性表单类的头文件中创建属性页对象
3. 在属性表单对象的构造函数中添加属性页
对象,调用CProperSheet类的成员函数
AddPage()添加每一个属性页
4. 调用DoModal( )函数显示一个模态属性表
单或调用Creat()函数创建一个非模态表单
2013年8月 VC++程序设计
113
创建向导
创建一个向导类型的对话框,应该遵循
创建标准属性表单的步骤来实现,但在
调用属性表单对象的DoModal函数之前,
应该先调用SetWizardMode这一函数
2013年8月 VC++程序设计
114
属性表单相关的类及其成员
CProperSheet
AddPage( )
DoModal( )
Create( )
SetWizardMode( )
SetWizardButtons( )
OnSetActive( )
OnWizardNext( )
OnWizardFinish( )
CProperPage
memset( )
2013年8月 VC++程序设计
115
附录
2013年8月 VC++程序设计
116
主目录
参考书
匈牙利命名法
匈牙利命名法
基本原则:变量名=属性+类型+对象描述
容易记忆容易理解
2013年8月 VC++程序设计
117
参考书
书名 作者 版次
C++程序设计 谭浩强 编著 2004年第1版
NCRE二级教程——
C++语言程序设计
2013年第1版
计算机程序设计基础——
精讲多练C/C++语言
罗建军 编著 2009年第1版
C程序设计 谭浩强 著 2005年第3版
VC++深入详解 孙鑫 徐安萍 编著 2006年
2013年8月 VC++程序设计
118
2013年8月 VC++程序设计
119

Contenu connexe

Similaire à VC++ Programming Training Lecture in Control Lab 301 of YSU

Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
lydiafly
 
C++工程实践
C++工程实践C++工程实践
C++工程实践
Shuo Chen
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
fangdeng
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
Will Huang
 
Lotus domino开发教程
Lotus domino开发教程Lotus domino开发教程
Lotus domino开发教程
dyzm_2000
 
Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化
向 翔
 

Similaire à VC++ Programming Training Lecture in Control Lab 301 of YSU (20)

Dev307
Dev307Dev307
Dev307
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
 
Ch10
Ch10Ch10
Ch10
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
getPDF.aspx
getPDF.aspxgetPDF.aspx
getPDF.aspx
 
Ecma script edition5-小试
Ecma script edition5-小试Ecma script edition5-小试
Ecma script edition5-小试
 
C++工程实践
C++工程实践C++工程实践
C++工程实践
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
竞赛中C++语言拾遗
竞赛中C++语言拾遗竞赛中C++语言拾遗
竞赛中C++语言拾遗
 
Javascript代码注释及文档生成
Javascript代码注释及文档生成Javascript代码注释及文档生成
Javascript代码注释及文档生成
 
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
Linux c++ 编程之链接与装载 -基础篇--v0.3--20120509
 
软件工程
软件工程软件工程
软件工程
 
手把手教你 R 語言分析實務
手把手教你 R 語言分析實務手把手教你 R 語言分析實務
手把手教你 R 語言分析實務
 
ajax_onlinemad
ajax_onlinemadajax_onlinemad
ajax_onlinemad
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
 
Lotus domino开发教程
Lotus domino开发教程Lotus domino开发教程
Lotus domino开发教程
 
Metadata4shenzhen Final
Metadata4shenzhen FinalMetadata4shenzhen Final
Metadata4shenzhen Final
 
Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化Sql Server 高级技巧系列之三整体优化
Sql Server 高级技巧系列之三整体优化
 

VC++ Programming Training Lecture in Control Lab 301 of YSU