二、C++浏览
1、内置数组数据类型【array】
数组是一种顺序容器,包含单一类型的元素。
数组的下标从0开始。【容易发生“一位偏移错误”,导致越界】
C++对数组的支持,仅限于对其中单个元素进行操作,不支持数组的抽象和对整个数组的操作。【譬如不能直接把一个数组复制给另一个使用】
Q1:为什么内置数组类型不支持数组之间的赋值,支持这样的赋值需要什么信息?
{需要数组中元素的数据类型,数组的长度等信息}因为在创建数组时,内存大小的类型已经被确定了。
Q2:一等公民的数组应该支持怎样的操作?
直接赋值,直接比较等等
2、动态内存分配和指针
C++中的对象分配内存可以动态分配也可以静态分配。
静态分配:编译器在处理程序源代码时分配内存。【程序执行前】
动态分配:程序执行时调用运行时刻库函数来分配。
静态分配实例:指示器分配足够的储存区给变量
int ival1 = 1024;
有两个值和对象ival有关系,一个是储存的值,另一个是它的地址。可以通过指针来访问地址:其中&是取址符,能返回对象的地址,*是解引用符,用于访问其地址指向的对象。【指针的主要作用并不在此,而是在于管理和操作动态空间】
int *p; //一个指向int类型的指针
int *p1;
p = &ival; //让p指向ival地址
*p = *p+1; //等价于 ival = ival+1
静态动态主要区别:1、是否能直接对对象进行操作;2、对象的分配和释放是否需要自己管理。【对于动态需要new和delete表达式来管理】
new的两种表达式:
int *p = new int(1024);//使用小括号分配一个int类型的对象,但是它没有名字,只返回其动态分配的地址。
int *p = new int[4];//使用中括号分配一个int类型的数组对象,但是不能赋值,返回的也是地址
delete的两种表达式:
delete p; //删除单个对象
delete []p;//删除一个对象数组
动态分配的内存一定要显式地去删除,否则会出现内存泄漏的问题【泄漏指的是,我们动态分配了内存后,如果没有返还,下次使用时,就没有指向这个地址的指针,再用不了这个内存,相当于泄漏了】。
Q1:说出下面定义的四个对象之间的区别(a) int ival = 1024; (c) int *pi2 = new int( 1024 );(b) int *pi = &ival; (d) int *pi3 = new int[ 1024 ];a和b一个是声明的变量,一个声明的是指向变量的指针,两者使用的内存都是静态的内存;c和d都是使用new声明的动态内存,c是整型,d是数组。Q2:下面的代码段是做什么的,有什么严重错误?注意:指针 pia 的下标操作符的用法是正确的 在 3.9.2 节中我们会解释其理由int *pi = new int( 10 );int *pia = new int[ 10 ];while ( *pi < 10 ) {pia[ *pi ] = *pi;*pi = *pi + 1;}delete pi;delete [] pia;因为在循环中,使用的是pi这个指针,然而指针指向的动态内存只声明了一个整型变量,可能存在越界的问题。
3、基于对象的设计
类的一般形式:
class classname{
public:
//公共接口
private:
//私有接口
};
其中:class、public、private是C++语言的关键字,classname是用户定义的标志符。创建完之后,相当于新加了一个数据类型,在使用时,可以和基本的类型一样使用:
// 单个 IntArray 类对象
IntArray myArray;
// 指向 IntArray 类对象的指针
IntArray *pArray = new IntArray;
类体内包含成员定义以及访问标签【public、private】,类的成员包括函数和变量。
两种访问成员的方式:对于类的对象,使用.;对于类的指针对象,使用->。