有些部分在C程序设计有总结。点击进入C程序语言设计栏
数组:具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。
数组的声明:
数据类型 数组名[常量表达式1] [常量表达式2]…
例如:int a[10];
表示 a 为整型数组,有10个元素:a[0]...a[9]
对象数组:数组的元素不仅可以是基本数据类型,也可以是自定义类型。对象数组的元素是对象,每一个元素不仅有数据成员,而且还有函数成员。
v 声明:
类名 数组名[元素个数];
v 访问方法:
通过下标访问
数组名[下标].成员名
对象数组初始化:
v 数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。
v 通过初始化列表赋值。
v 如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化
数组元素所属类的构造函数:
v 不声明构造函数,则采用缺省构造函数。
v 各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。
v 各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。
v 当数组中每一个对象被删除时,系统都要调用一次析构函数。
内存空间的访问方式:
v 内存空间的访问方式
① 通过变量名访问
② 通过地址访问
v 地址运算符:&
指针名=地址:
v “地址”中存放的数据类型与指针类型必须相符。
v 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。
v 指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsigned long int型。
v 允许声明指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。
l 指向常量的指针:
不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
例
int a;
const int *p1 = &a; //p1是指向常量的指针
int b;
p1 = &b; //正确,p1本身的值可以改变
*p1 = 1; //编译时出错,不能通过p1改变所指的对象
l 指针类型的常量:
若声明指针常量,则指针本身的值不能被改变。
例:
int a;
int * const p2 = &a;
p2 = &b;//错误,p2是指针常量,值不能改变
这两个概念比较容易混淆,仔细看加粗加色的标记部分进行了理解.
指针型函数:
当函数的返回值是地址时,该函数就是指针形函数。
声明形式
数据类型 *函数名(参数表)
{
函数体
}
以指针作为函数参数:
v 以地址方式传递数据,可以用来返回函数处理结果。
v 当需要在函数间传递大量数据时,减少开销
v 实参是数组名时形参可以是指针。
对象指针的一般概念:
声明形式
类名 *对象指针名;
例
Point a(5,10);
Piont *ptr;
ptr=&a;
对象指针是用于存放对象地址的变量
通过指针访问对象成员:
对象指针名->成员名
ptr->getx() 相当于 (*ptr).getx();
this指针:(首先做的是知道有这个this指针,理解不了慢慢来)
v 隐含于每一个类的成员函数中的特殊指针。
v 明确地指出了成员函数当前所操作的数据所属的对象。
n 当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员 函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针
指向类的非静态成员的指针:(类的成员自身也是一些变量、函数或者对象,因此也可以直接将他们的地址存放到一个指针变量中,这样,就可以使指针直接指向对象的成员,进而通过指针访问)
v 通过指向成员的指针只能访问公有成员
v 声明指向成员的指针
l 声明指向公有数据成员的指针
类型说明符 类名::*指针名;
l 声明指向公有函数成员的指针
类型说明符 (类名::*指针名)(参数表);
动态申请内存操作符 new 和delete.(ew和delete是C++中的运算符,不是库函数,不需要库的支持 )
v 指向函数成员的指针:
l 初始化
指针名=&类名::函数成员名;
l 通过对象名(或对象指针)与成员指针结合来访问函数成员
(对象名.*类成员指针名)(参数表)
或:
(对象指针名->*类成员指针名)(参数表)
v 指向类的静态成员的指针:
l 对类的静态成员的访问不依赖于对象
l 可以用普通的指针来指向和访问静态成员
动态申请内存操作符 new 和delete.(ew和delete是C++中的运算符,不是库函数,不需要库的支持 )
Ø 用vector创建动态数组:(STL中的内容解决部分算法问题)
l 将动态数组封装,自动创建和删除
l 数组下标越界检查
l 只适用于一种类型的数组
v vector动态数组对象的定义:
l vector<<font face="宋体">元素类型> 数组对象名(数组长度);
l 例:vector arr(5)
建立大小为5的int数组
v 对数组元素的引用
l 与普通数组具有相同形式:
数组对象名 [ 下标表达式 ]
但vector数组对象名不表示数组首地址
v 获得数组长度
n 用size函数
数组对象名.size()
vector应用举例
#include
#include
using namespace std;
//计算数组arr中元素的平均值
double average(const vector &arr) {
double sum = 0;
for (unsigned i = 0; i < arr.size(); i++)
sum += arr[i];
return sum / arr.size();
}
int main() {
unsigned n;//unsigned无符号de整型变量
cin >> n; cout << "n = ";
vector arr(n); //创建数组对象
cout << "Please input " << n << " real numbers:" << endl;
for (unsigned i = 0; i < n; i++)
cin >> arr[i];
cout << "Average = " << average(arr) << endl;
return 0;
}
string的用法:
v 常用构造函数
l string(); //缺省构造函数,建立一个长度为0的串
l string(const char *s); //用指针s所指向的字符串常量初始化string类的对象
l string(const string& rhs); //拷贝构造函数
v 例:
l string s1; //建立一个空字符串
l string s2 = “abc”; //用常量建立一个初值为”abc”的字符串
l string s3 = s2; //执行拷贝构造函数,用s2的值作为s3的初值
v 常用操作符:
l s + t 将串s和t连接成一个新串
l s = t 用t更新s
l s == t 判断s与t是否相等
l s != t 判断s与t是否不等
l s < t 判断s是否小于t(按字典顺序比较)
l s <= t 判断s是否小于或等于t (按字典顺序比较)
l s > t 判断s是否大于t (按字典顺序比较)
l s >= t 判断s是否大于或等于t (按字典顺序比较)
l s[i] 访问串中下标为i的字符
v 例:
l string s1 = “abc”, s2 = “def”;
l string s3 = s1 + s2; //结果是”abcdef”
l bool s4 = (s1 < s2); //结果是true
l char s5 = s2[1]; //结果是’e