Contenu connexe Similaire à VC++ Programming Training Lecture in Control Lab 301 of YSU (20) VC++ Programming Training Lecture in Control Lab 301 of YSU3. C++基础
2013年8月 VC++程序设计
3
目录
C++语言支持的新特性
常量
变量
数据类型
指针
引用
字符串
函数
枚举
共用体
结构体
位域
类
运算符重载
继承和派生
多态性和虚函数
输入输出流
用typedef声明类型
预处理命令
主目录
类
运算符重载
继承和派生
多态性和虚函数
输入输出流
用typedef声明类型
预处理命令
C++语言支持的新特性
常量
变量
数据类型
指针
引用
字符串
函数
枚举
共用体
结构体
位域
4. 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++”
目录
9. 源代码(小例子)
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;
12. 有关指针的数据类型
定义 含义
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
16. 数组与指针
一维数组与指针
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
18. 动态存储分配
运算符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
19. 引用
int &b = a; //声明b是a的引用(别名)
声明引用时必须使之初始化
声明b是a的引用后,b不能再作为其他变
量的引用,且b和a占同一存储单元,具
有同一地址(指针变量需另外开辟空间)
主要用来作为函数参数
调用函数时,实参是变量名不是地址,
而系统向形参传递的是地址不是其值
2013年8月 VC++程序设计
19
目录
22. 指针、引用、字符串源代码
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;
28. 枚举
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
目录
32. 枚举、共用体、结构体、位段源代码
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;
34. 类的声明与对象的定义
先声明,后定义
class Student{ };
Student stud1; 或
class Student{ };
class Student stud;
声明时定义
class Student
{ }stud;
不出现类名直接定义
class { }stud;
在类中,系统默认声明的成员
为私有成员;在结构体中,系
统默认声明的成员为公有成员
声明类时不能初始化数据成员
公有成员函数为类的对外接口
须在类内声明类函数,最好在
类外定义类函数,类外定义函
数时须指明作用域
类内定义的成员函数被隐含的
指定为内置函数
2013年8月 VC++程序设计
34
35. 对象成员对象的访问
Student stud, *p, &stud1 = stud, stu[3]; p = &stud;
对象名.成员名
stud.display( )
指向对象的指针→成员名
P→display( ); 或 (*p).display( );
对象的引用.成员名
stud1.display( );
对象数组元素.成员名
stu[0].display( );
2013年8月 VC++程序设计
35
36. 构造函数
构造函数与类同名,无返回值(无需声明类型),一般声明为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
38. 对象指针
指向对象的指针
对象空间的起始
地址
类名 *对象指针
名
Box *p, a;
p = &a;
指向对象成员的指针
对象成员空间的起
始地址
指向对象数据成员
的指针
int *p1;
p1 = &a1.width;
指向对象成员函数
的指针
void (Box::*p2)( );
P2 = &Box::volume;
(&在C程序中可省)
2013年8月 VC++程序设计
38
this指针
当前被调用的非
静态成员函数所
在对象的起始地
址,即指向本类
对象的指针
默认隐式使用,
作为参数传给非
静态类函数,也
可显示使用
40. 共用数据的保护
常对象
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
42. 对象的赋值与复制
对象的赋值
Box box1, box2;
box2 = box1;
同类对象之间
通过成员复制完成,即将
一个对象的成员值一一复
制给另一对象的对应成员
对一个已存在的对象赋值
对象的复制
Box box2(box1);
用一个已有的对象快速地
复制出多个完全相同的对
象
建立对象时调用复制构造
函数
从无到有地建立一个新对
象,并使它与一个已有的
对象(包括对象的结构和成
员的值)完全相同
2013年8月 VC++程序设计
42
44. 类和对象源代码(二)
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)
{
}
48. 2013年8月 VC++程序设计
48
基类成员 在公用派生类中 在私有派生类中 在保护派生类中
私有成员 不可访问 不可访问 不可访问
公用成员 公用 私有 保护
保护成员 保护 私有 保护
派生类成员 在派生类中 在派生类外部 在下层公用派生类中
公用成员 可以 可以 可以
保护成员 可以 不可以 可以
私有成员 可以 不可以 不可以
不可访问的成员 不可以 不可以 不可以
基类成员在派生类中的访问属性
派生类中的成员的访问属性
56. 多态性与虚函数源代码
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;
63. 宏定义
不带参数的宏定义
#define 宏名 字符串
#undef 宏名
终止宏定义的作用域
宏名一般习惯大写
可引用已定义的宏名,层
层置换
宏展开:在预编译时将宏
名替换成字符串的过程;
只做简单替换,不做正确
性检查
带参数的宏定义
#define 宏名(参数表) 字符串
在宏名与带参数的括号之间
不应加空格
宏名和参数均无类型,只是
一个符号代表
宏替换不分配内存空间,不
占运行时间,只占编译时间;
函数调用则占运行时间(分
配单元、保留现场、值传递、
返回)
2013年8月 VC++程序设计
63
66. 模板
函数模板
template<typename T>
通用函数定义 或
template<class T>
通用函数定义
类型参数可以不止一个
template<class T1,class T2>
只适用于函数体相同、函
数的参数个数相同而类型
不同的情况
类模板
template<class或typename T>
通用类定义
类模板名<实际类型名>
→实际类名
类外定义成员函数:
要多加一行template<class
T>
类型参数可以不止一个,在定
义对象时分别代入实际类型名
模板可有层次,一个类模板可
作为基类,派生出派生模板类
2013年8月 VC++程序设计
66
目录
67. 模板源代码
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;
68. 异常处理
程序中常见的两大错误:语法(编译)错误和运行错误
异常处理:对运行时出的差错及其他例外情况的处理
C++异常处理机制 = 检查(try) + 抛出(throw) + 捕捉(catch)
在一个try-catch结构中,可只有try块而无catch块;只能有一
个try块,但却可有多个catch块;其语句须用花括号括起来;
二者之间不能插入其他语句
catch后的圆括号中一般只写类型名,也可指定变量名;还
可用删节号“…”(可捕捉任何类型的信息,一般在最后)
catch (double){}; catch (double a){}; catch (…){};
throw可以不包括表达式(表示不抛出这个异常,请上级处
理);若其抛出的异常信息找不到与之匹配的catch块,则系
统会调用一个系统函数terminate,使程序终止运行
2013年8月 VC++程序设计
68
目录
69. 在函数声明时指定异常
列出可能抛出的类型
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;
}
71. 命名空间源代码
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;
}
73. 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目前最稳定
目录
74. 熟悉
Visual C++ 6.0 IDE
2013年8月 VC++程序设计
74
主目录
目录
VC++ 6.0主界面
编辑代码时常用的技巧
VC++的帮助功能
VC++6.0的文件类型
VC++ 6.0主界面
编辑代码时常用的技巧
VC++的帮助功能
VC++6.0中的文件类型
75. Visual C++ 6.0 主界面
2013年8月 VC++程序设计
75
工
作
区
窗
口
输出窗口
代
码
编
辑
区
工
具
栏
标题栏
菜
单
栏
状态栏
目录
85. 程序设计
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工作原理
,但工作量大
复杂,代码可读性
差,但工作量小
97. 简单绘图相关的类及其成员
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
时,虚线线型才有效
将画刷句柄转
化为画刷对象
105. 常用控件及其对应的控件类
控件 功能 对应控件类
静态文本框(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
108. 对话框相关的类及其成员
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
属
性
的
控
件
118. 参考书
书名 作者 版次
C++程序设计 谭浩强 编著 2004年第1版
NCRE二级教程——
C++语言程序设计
2013年第1版
计算机程序设计基础——
精讲多练C/C++语言
罗建军 编著 2009年第1版
C程序设计 谭浩强 著 2005年第3版
VC++深入详解 孙鑫 徐安萍 编著 2006年
2013年8月 VC++程序设计
118