|
|
[flash=480,400,0]http://www.tudou.com/v/Ztv2hPwmbI4/&rpid=320719587&resourceId=320719587_04_05_99/v.swf[/flash]
http://www.tudou.com/programs/view/Ztv2hPwmbI4/
C++的一些基本语法和用法,
我在快速学会VC++中都有讲到,
为了不耽误大家时间,这里我就不讲了。
需要的朋友可以去看看那套教程。
因为时间关系只能进行简单介绍
快速学会VC++中没有涉及到的一些知识。
如果次YY讲完 冲哥觉得有公布的价值。
我会把我现在所讲的课件发个冲哥整理。公布
C++保留了C语言,
原有的所有优点,
增加了面向对象的机制。
C++是由C发展而来的,
并与C兼容用C语言写的程序
基本上可以不加修改地用于C++。
关于C的部分就不做介绍了
1. 字符串 (这个在vc驿站的基础课里就有1个多小时)
C++对字符串的处理有两种方法:
一种是用字符数组的方法,
这是C语言采取的方法, 一般称为C
一种是用string类定义字符串变量,称为string方法。
string方法概念清楚,使用方便,
最好采用这种方法。字符串操作string
另外:
可以直接用==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)
等关系运算符来进行字符
2引用
对一个数据可以使用“引用”,
这是C++对C的一个重要扩充,
引用是一种新的变量类型,
它的作用是为一个变量起一个别名。
例子:
inta; //定义a是整型变量
int&b=a; //声明b是a的引用
以上语句声明了b是a的引用,即b是a的别名。经过
这样的声明后,a或b的作用相同,都代表同一变量
在上述声明中,&(and)是引用声明符,并不代表地址。
不要理解为“把a的值赋给b的地址”。
声明变量b为引用类型,
并不需要另外开辟内存单元来存放b的值。
b和a占内存中的同一个存储单元,它们具有同一地址。
声明b是a的引用,可以理解为:使变量b具有变量a的地址。
当看到&a这样的形式时,
怎样区别是声明引用变量还是取地址的操作呢?
当&a的前面有类型符时(如int&a),它必然是对引用的声明;
如果前面无类型符(如cout<<&a),则是取变量的地址。
引用不仅可以用于变量,也可以用于对象。
例如实参可以是一个对象名,
在虚实结合时传递对象的起始地址。
关于详细的可以去查看相关资料
3.
动态分配和撤销内存的运算符new和delete
new 类型[初值]
new int(100);
//开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向
该存储空间的地址
float *p=new float(3.14159); //开辟一个存放单精度数的空间,并指定该
实数的初值为
delete [ ] 指针变量
delete p;
用new分配 数组 空间 时不能指定初值。
如果由于内存不足等原因而无法正常分配空间,
则new会返回一个空指针NULL,
用户可以根据该指针的值判断分配空间是否成功。
4.公用体
有时需要 使几种不同 类型的 变量 存放到同一段内存单元中。
“共用体”与“结构体”的定义形式相似。
union 共用体类型名
{成员表列
};
结构体变量所占内存长度是各成员占的内存长度之和。
每个成员分别占有其自己的内存单元。
共用体变量所占的内存长度等于最长的成员的长度。
(1.使用共用体变量的目的是希望用同一个内存段
存放几种不同类型的数据。
但 在每一瞬时只能存放其中一种,而不是同时存放几种。
(2.能够访问的是 共用体变量中 最后一次被赋值的成员,
在对一个新的 成员赋值 后原有的成员就失去作用。
(3 共用体变量的地址和它的各成员的地址都是同一地址。
4 不能对共用体变量名赋值;
不能企图引用变量名来得到一个值;
不能在定义共用体变量时对它初始化;
不能用共用体变量名作为函数参数。
成员名与变量名要分清楚
5枚举
如果一个变量只有几种可能的值,可以定义为枚举类型。
用枚举变量更直观,因为枚举元素都选用了令人“见名知意”的标识符,
而且枚举变量的值限制在定义时规定的几个枚举元素范围内,
如果赋予它一个其他的值,就会出现出错信息,便于检查。
6.
作用域运算符
在类体中直接定义函数时,
不需要在函数名前面加上类名,
因为函数属于哪一个类是不言而喻的。
但成员函数在类外定义时,
必须在函数名前面加上类名,予以限定,
“∷”是作用域限定符或称作用域运算符,
用它声明函数是属于哪个类的。
如果在作用域运算符“∷”的前面没有类名,
或者函数名前面既无类名又无作用域运算符“∷”,
表示这个函数不是成员函数,而是全局函数,
即非成员函数的一般普通函数。
7
面对对象的名词:
对象就是 类 类型的一个变量。
类是抽象的,不占用内存,而对象是具体的,占用存储空间
“方法”是指对数据的操作。一个“方法”对应一种操作。
只有被声明为公用的方法(成员函数)才能被对象外界所激活。
外界是通过发“消息”来激活有关方法的。所谓“消息”,
其实就是一个命令,由程序语句来实现
7.
this 指针
每个对象中的数据成员都分别占有存储空间,
如果对同一个类定义了n个对象,
则有n组同样大小的空间以存放n个对象中的数据成员。
但是,不同对象都调用同一个函数代码段。
那么,当不同对象的成员函数引用数据成员时,
怎么能保证引用的是所指定的对象的数据成员。
在每一个成员函数中都包含一个特殊的指针,
这个指针的名字是固定的,称为this。
它是指向本类对象的指针,
它的值是 当前被调用的 成员函数所在的 对象的起始地址
this指针是隐式使用的, 它是作为参数被传递给成员函数的
编译系统自动实现,编程序者 不必人为地在形参中增加this指针,
也不必将对象的地址传给this指针。
在需要时也可以显式地使用this指针
8.
常对象
在定义对象时指定对象为常对象。常对象必须要有初值,
如
Time const t1(12,34,46); //t1 是常对象
在所有的场合中,对象t1中的所有成员的值都不能被修改。
凡希望保证数据成员不被改变的对象,
可以声明为常对象。
定义常对象的一般形式为
类名 const 对象名[(实参表列)];
也可以把const写在最左面:
const 类名 对象名[(实参表列)];
二者等价。
如果一个对象被声明为常对象,
则 不能调用该对象 的非const型的成员函数
(除了由系统自动调用的隐式的构造函数和析构函数)。
这是为了防止这些函数会修改常对象中数据成员的值。
引用常对象中的数据成员很简单,
只需将该成员函数声明为const即可
void get_time( ) const; //将函数声明为const
常成员函数。常成员函数可以访问常对象中的数据成员,
但仍然不允许修改常对象中数据成员的值。
常数据成员
其作用和用法与一般常变量相似,
用关键字const来声明常数据成员。
常数据成员的值是不能改变的。
有一点要注意:
只能通过构造函数的参数初始化表对常数据成员进行初始化。
有时在编程时有要求,
一定要修改常对象中的某个数据成员的值,
ANSI C++考虑到实际编程时的需要,
对此作了特殊的处理,
对该数据成员声明为
miu te bou
mutable,如
mutable int count;
把count声明为可变的数据成员,
这样就可以用声明为const的成员函数来修改它的值。
指向对象的常指针
将指针变量声明为const型,
这样指针值始终保持为其初值,不能改变
(1) 如果一个对象已被声明为常对象,
只能用指向常对象的指针变量指向它,
而不能用一般的(指向非const型对象的)指针变量去指向它。
(2) 如果定义了一个指向常对象的指针变量,
并使它指向一个非const的对象,
则其指向的对象是不能通过指针来改变的。
如果希望在任何情况下t1的值都不能改变,
则应把它定义为const型。
(3) 指向常对象的指针最常用于函数的形参,
目的是在保护形参指针所指向的对象,
使它在函数执行过程中不被修改。
(4) 如果定义了一个指向常对象的指针变量,
是不能通过它改变所指向的对象的值的,
但是指针变量本身的值是可以改变的
形式 含义
Time const t1; t1是常对象,其值在任何情况下都不能改变
void Time∷fun( )const fun是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员
Time *const p; p是指向Time对象的常指针,p的值(即p的指向)不能改变
const Time *p; p是指向Time类常对象的指针,其指向的类对象的值不能通过指针来改变
Time &t1=t; t1是Time类对象t的引用,二者指向同一段内存空间
9运算符的重载
所谓重载,就是重新赋予新的含义.
函数重载就是对一个已有的函数赋予新的含义,
使之实现新功能。运算符也可以重载。
例如 &表示 取地址 也表示引用??
运算符重载的方法是定义一个重载运算符的函数,
在需要执行被重载的运算符时,
系统就自动调用该函数,
以实现相应的运算。也就是说,
运算符重载是通过定义函数实现的。
运算符重载实质上是函数的重载。
重载运算符的规则:
(1) C++不允许用户自己定义新的运算符,
只能对已有的C++运算符进行重载。
(2) C++允许重载的运算符
C++中绝大部分的运算符允许重载。具体规定要去查资料。
不能重载的运算符只有5个:
. (成员访问运算符)
.*(成员指针访问运算符)
∷(域运算符)
sizeof (长度运算符)
?: (条件运算符)
前所以讲运算符不能重载是为了保证访问成员的功能不能被改变,
域运算符和sizeof运算符的运算对象
是类型而不是变量或一般表达式,
不具重载的特征。
(3) 重载不能改变运算符运算对象(即操作数)的个数。
(4) 重载不能改变运算符的优先级别。
(5) 重载不能改变运算符的结合性。
(6) 重载运算符的函数不能有默认的参数,
否则就改变了运算符参数的个数,与前面第(3)点矛盾。
(7) 重载的运算符必须和用户定义的自定义类型的对象一起使用,
其参数至少应有一个是类对象(或类对象的引用)。
也就是说,参数不能全部是C++的标准类型,
以防止用户修改用于标准类型数据的运算符的性质。
(8) 用于类对象的运算符一般必须重载,
但有两个例外,运算符“=”和“&”不必用户重载。
① 赋值运算符(=)可以用于每一个类对象,可以利用它在同类对象之间相互赋值。
② 地址运算符&也不必重载,它能返回类对象在内存中的起始地址。
(9) 应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的功能。
(10) 运算符重载函数可以是类的成员函数
转换构造函数
?默认构造函数。以Complex类为例,函数原型的形式为
Complex( ); //没有参数
?用于初始化的构造函数。函数原型的形式为
Complex(double r,double i); //形参表列中一般有两个以上参数
?用于复制对象的复制构造函数。函数原型的形式为
Complex (Complex &c); //形参是本类对象的引用
转换构造函数。转换构造函数只有一个形参,如
Complex(double r) {real=r;imag=0;}
可以有转换构造函数,也可以没有转换构造函数,
视需要而定。以上几种构造函数可以同时出现在同一个类中,
它们是构造函数的重载
用转换构造函数可以将一个指定类型的数据转换为类的对象。
但是不能反过来将一个类的对象转换为一个其他类型的数据
C++提供类型转换函数来解决这个问题。
类型转换函数的作用是将一个类的对象转换成另一类型的数据。
类型转换函数的一般形式为
operator 类型名( )
{实现转换的语句}
在函数名前面不能指定函数类型,
函数没有参数。
其返回值的类型是由函数名中指定的类型名来确定的。
类型转换函数只能作为成员函数,
因为转换的主体是本类的对象。
不能作为友元函数或普通函数。
它与运算符重载函数相似,
都是用关键字operator开头,
只是被重载的是类型名
10继承派生
所谓“继承”就是在一个已存在的类的基础上建立一个新的类。
通过继承,一个新建子类从已有的父类那里获得父类的特性。
从另一角度说,从已有的类(父类)产生一个新的子类,称为类的派生.
派生类分为两大部分:
一部分是从基类继承来的成员,
另一部分是在声明派生类时增加的部分。
每一部分均分别包括数据成员和成员函数。
11多态性 虚函数
多态性是指 具有不同功能的函数 可以用同一个函数名,
这样就可以用一个函数名 调用 不同内容的函数。
在面向对象方法中一般是这样表述多态性的:
向不同的对象发送同一个消息,
不同的对象在接收时会产生不同的行为(即方法)。
也就是说,每个对象可以用自己的方式去响应共同的消息。
虚函数的作用是允许在派生类中
重新定义与基类同名的函数,
并且可以通过基类指针或引用来访问
基类和派生类中的同名函数。
12.命名空间
所谓命名空间,实际上就是一个
由程序设计者命名的内存区域。程序设计者可以根
据需要指定一些有名字的空间域,把一些全局实体
分别放在各个命名空间中,从而与其他全局实体分隔开来。
关于API
Windows API 有版本演化问题,Windows 每一个版本都会新增加一些 API。
因此在编译时,特别需要注意所使用的 API 对系统版本的要求,
可能某些系统还不具备这些 API。
一些较新的应用程序,在较老的版本的系统上运行,
可能会出现一些特定的 API 函数无法在指定的 DLL 中找到的情况,
这就是由于所需的 API 仅出现在较新版本的系统中。
面向对象是一种程序设计思想,而不是指具体的程序设计语言类型。
Windows 系统虽然是使用 C 语言程序开发的,
Windows 应用程序 API 也大多为 C 形式,但是 Windows 系统本身却是
很好的面向对象思想的体现。
MFC
所谓“封装”,指两方面的含义:
一是将有关的数据和操作代码封装在一个对象中,
形成一个基本单位,各个对象之间相对独立,互不干扰。
二是将对象中某些部分对外隐蔽,
即隐蔽其内部细节,只留下少量接口,
以便与外界联系,接收外界的消息。
这种对外界隐蔽的做法称为信息隐蔽。
信息隐蔽还有利于数据安全,
防止无关的人了解和修改数据。
关于MFC的使用我在 我的课程里讲的比较详细。
好比修房子,
房子我们住的地方
关于修建,
可用用钢筋混凝土???砖头
可以是帐篷
可以是拼接的。
|
|