您的位置:首页 > 编程语言 > C语言/C++

《C++ Primer》读书笔记(第一章)

2013-04-22 15:41 183 查看

关于*与&

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 ); 
              // ... 
         }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: