关于*与&
C++支持用指针类型来存放对象的内存地址值 例如 为了声明一个能存放ival 内存地址的指针类型 我们可以这样写
// 一个指向 int类型的指针
int *pint;
C++预定义了一个专门的取地址(address-of ) 操作符( & ) 当我们把它应用在一个对象上时 返回的是对象的地址值 因此 为了将ival 内存地址值赋给pint。我们可以这样写
int *pint;
pint = &ival; // 把 ival的地址 pint
为了访问pint 所指向的实际对象 我们必须先用解引用( dereference ) 操作符 * 来解除pint 的引用 dereference pint 例如 下面我们通过pint 间接地给ival 加1
// 通过 pint 间接地给 ival加 1
*pint = *pint + 1;
它等价于下面直接对ival 操作的语句
// 直接给 ival加 1
ival = ival + 1;
在C++中 指针的主要用处是管理和操纵动态分配的内存
静态与动态内存分配的两个主要区别是
1.静态对象是有名字的变量 我们直接对其进行操作 而动态对象是没有名字的变量我们通过指针间接地对它进行操作 稍后我们会看到一个例子
2.静态对象的分配与释放由编译器自动处理 程序员需要理解这一点 但不需要做任何事情 相反 动态对象的分配与释放 必须由程序员显式地管理 相对来说比较容易出错
它通过new 和delete 两个表达式来完成
-------new----------
单个对象 例如
int *pint = new int( 1024 );
分配特定类型和维数的数组 例如
int *pia = new int[ 4 ];
--------
-delete-----------
// 删除单个对象
delete pint;
数组形式的delete 表达式如下
// 删除一个对象数组
delete [] pia;
分配动态数组时一个常令人迷惑的问题是 返回值只是一个指针 与分配单一动态对象的返回类型相同 例如 pint 与pia 的不同之处在于 pia 拥有四元素数组的第一个元素的地址 而pint 只是简单地包含单一对象的地址
关于类成员的访问
?bool operator==( const IntArray& ) const;(const? &?)
通过使用两个成员访问操作符(member access operator)中的一个 我们可以调用一个有名字的成员函数 如min()
这两个操作符为 用于类对象的点操作符 . 以及用于类对象指针的箭头操作符 ->
例如 为了在数组myArray 类对象中找到最小值 我们可以这样写
// 用 myArray数组中的最小元素来初始化 min_val
int min_val = myArray.min();
为了在动态分配的IntArray 对象中查找最大值 我们可以这样写
int max_val = pArray->max();
private成员只能在该类的成员函数或友元( friend)中才能被访问
内联函数( inline function) 机制 内联函数在它的调用点上被展开(然而 实际并不总是这样的 对于编译器来说 内联函数是一种请求 而不是一种保证)
关于重载OverLoad
函数重载允许两个或更多个函数使用同一个名字 限制条件是它们的参数表必须不同 参数类型不同 或参数的数目不同
重载函数在运行时刻的行为与非重载函数完全一样 主要的负担是在编译时刻用来决定中该调用哪个实例所需要的时间
关于Static数据类型
被声明为static 的数据成员是一类特殊的共享数据成员 无论这个类的对象被定义了多少个 静态数据成员在程序中也只有一份,这是在类的所有对象之间共享数据的一种方式
引用 reference
即IntArray &rhs 引用是一种没有指针语法的指针 因此 我们写成rhs._size 而不是rhs->_size 与指针一样 引用提供对对象的间接访问
虚拟函数
比 非虚拟函数的效率要低一些 . 因为它们不能被内联 内联发生在编译时刻 而虚拟函数是在运行时刻被处理的 所以它们可能是运行时刻效率低下的原因之一
命名空间与别名
// 提供一个更一般化的别名
namespace LIB = IBM_Canada_Laboratory;
----------
#include "IBM_Canada.h"
namespace LIB = IBM_Canada_Laboratory;
int main()
{
LIB::Array<int> ia(1024);
// ...
}
using 声明 using declaration 提供了选择更为精细的名字可视性机制 它允许使名字中间中的单个声明可见 例如
#include "IBM_Canada_Laboratory.h"
// 只让 Matrix可见
using IBM_Canada_Laboratory::Matrix;
int main()
{
// ok: IBM_Canada_Laboratory::Matrix
Matrix mat(4,4);
// error: IBM_Canada_Laboratory::Array not visible
Array<int> ia( 1024 );
// ...
}