好文档 - 专业文书写作范文服务资料分享网站

7 第6章 数组、指针与字符串(二)

天下 分享 时间: 加入收藏 我要投稿 点赞

private:

int x, y; };

//动态数组类

class ArrayOfPoints { public:

ArrayOfPoints(int size) : size(size) { points = new Point[size]; }

~ArrayOfPoints() {

cout << \ << endl; delete[] points; }

Point &element(int index) {//获得下标为index的数组元素

assert(index >= 0 && index < size);//如果数组下标不会越界,程序中止

return points[index];

}

private:

Point *points; //指向动态数组首地址 int size;

//数组大小

};

int main() { int count;

cout << \; cin >> count;

ArrayOfPoints points(count); //创建对象数组

points.element(0).move(5, 10); //通过访问数组元素的成员 points.element(1).move(15, 20); //通过类访问数组元素的成员

return 0; }

运行结果:

Please enter the number of points:2 Default Constructor called. Default Constructor called. Deleting...

Destructor called. Destructor called.

为什么element函数返回对象的引用?

返回“引用”可以用来操作封装数组对象内部的数组元素。如果返回“值”则只是返回了一个“副本”,通过“副本”是无法操作原来数组中的元素的。 智能指针

● 显式管理内存在是能上有优势,但容易出错。

● C++11提供智能指针的数据类型,对垃圾回收技术提供了一些支持,实现一定程度的内存管理

6.3.4 C++11的智能指针

● 显式管理内存在是能上有优势,但容易出错。

● C++11提供智能指针的数据类型,对垃圾回收技术提供了一些支持,实现一定程度的内存管理

C++11的智能指针

● unique_ptr :不允许多个指针共享资源,可以用标准库中的move函数转移指针 ● shared_ptr :多个指针共享资源

● weak_ptr :可复制shared_ptr,但其构造或者释放对资源不产生影响 6.4 用vector创建数组对象 vector对象 为什么需要vector?

● 封装任何类型的动态数组,自动创建和删除。 ● 数组下标越界检查。

● 例6-18中封装的ArrayOfPoints也提供了类似功能,但只适用于一种类型的数组。 vector对象的定义

● vector<元素类型> 数组对象名(数组长度); ● 例:

vector arr(5) 建立大小为5的int数组 vector对象的使用 ● 对数组元素的引用

■ 与普通数组具有相同形式: vector对象名 [ 下标表达式 ] ● vector数组对象名不表示数组首地址 ■ 获得数组长度 ■ 用size函数 数组对象名.size() 例6-20 vector应用举例

//例6_20 vector应用举例.cpp(P225) #include #include using namespace std;

//计算数组arr中元素的平均值

double average(const vector &arr) { }

/*声明一个const vector&类型的引用arr。被引用的类型是const vector ,即只读的vector 。vector 是元素是double类型的 向量,可以当成动态长度的double数组。*/ double sum = 0;

for (unsigned i = 0; i < arr.size(); i++) sum += arr[i];

return sum / arr.size();

int main() { unsigned n;

cout << \; cin >> n; }

vector arr(n); //创建数组对象

cout << \ << n << \ << endl; for (unsigned i = 0; i < n; i++) cin >> arr[i];

cout << \ << average(arr) << endl; return 0;

运行结果:

基于范围的for循环配合auto举例

//例6_20_2 基于范围的for循环配合auto举例.cpp #include #include using namespace std;

int main() {

int a[3]={1,2,3};

std::vector v(a,a+3);//vector不能像数组一样赋值,只能通过提供的接口进

行操作 }

for(auto i = v.begin(); i != v.end(); ++i) std::cout << *i << std::endl; for(auto e : v)

std::cout << e << std::endl; return 0;

运行结果:

vector的几种初始化及赋值方式: (1)不带参数的构造函数初始化 //初始化一个size为0的vector vector abc; (2)带参数的构造函数初始化

//初始化size,但每个元素值为默认值

vector abc(10); //初始化了10个默认值为0的元素 //初始化size,并且设置初始值

vector cde(10,1); //初始化了10个值为1的元素 (3)通过数组地址初始化 int a[5] = {1,2,3,4,5};

//通过数组a的地址初始化,注意地址是从0到5(左闭右开区间) vector b(a, a+5); (4)通过同类型的vector初始化 vector a(5,1); //通过a初始化 vector b(a); (5)通过insert初始化

8ulss5up8i6ksx797jw59jajr88l5800wu5
领取福利

微信扫码领取福利

微信扫码分享