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

关于*与&

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.静态对象的分配与释放由编译器自动处理 程序员需要理解这一点 但不需要做任何事情 相反 动态对象的分配与释放 必须由程序员显式地管理 相对来说比较容易出错 

它通过newdelete 两个表达式来完成 

-------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 ); 
              // ... 
         } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值