爱猫的狗

拥抱变化

导航

《C++ Primer 3rd edition》读书笔记 - 第一篇 C++概述

标准C++中,如果main()函数没有显式地提供返回语句则它缺省返回0

#include 指示符读入指定文件的内容它有两种格式:
   如果文件名用尖括号< 和> 括起来,表明这个文件是一个工程或标准头文件,查找过程会检查预定义的目录
   如果文件名用一对引号括起来,则表明该文件是用户提供的头文件,查找该文件时将从当前文件目录开始

编译器自动定义了的预处理器名字:__cplusplus,__STDC__,__LINE__,__FILE__,__TIME__,__DATE__。(前两者不会被同时定义)

给出两个数组,我们不能用赋值操作符把一个数组拷贝到另一个中去



对象的动态分配可通过new 表达式的两个版本之一来完成。

   第一个版本用于分配特定类型的单个对象,例如:
      int *pint = new int( 1024 );
      分配了一个没有名字的int 类型的对象,对象初始值为1024 。然后表达式返回对象在内存中的地址,接着这个地址被用来初始化指针对象,pint 对于动态分配的内存惟一的访问方式是通过指针间接地访问。

   new 表达式的第二个版本用于分配特定类型和维数的数组,例如
      int *pia = new int[ 4 ];
      分配了一个含有四个整数元素的数组,不幸的是,我们没有办法给动态分配的数组的每个元素显式地指定一个初始值

我们可以通过使用delete 表达式的两个版本之一来释放内存
      单一对象的delete 表达式:delete pint;
      数组形式的delete 表达式:delete [] pia;

   在类定义中被定义的成员函数如size() 会被自动当作是内联函数

   假设类IntArray有如下的构造函数:
   explicit IntArray( int sz = DefaultArraySize );   这就是其缺省构造函数。如果程序员提供参数,则该值将被传递给构造函数。例如:IntArray array1( 1024 );   将参数1024 传递给构造函数。另一方面,如果用户不指定长度,那么构造函数将使用DefaultArraySize 的值(DefaultArraySize是类的一个static const成员)



      不是所有的成员函数都能自动地随类模板的实例化而被实例化,只有真正被程序使用到的成员函数才会被实例化,这一般发生在程序生成过程中的一个独立阶段。

      有如下声明:template <class elemType> class Array;   则对象定义 Array< int*& > pri( 1024 );  是错误的。因为int*&是引用,在定义时必须初始化,而模板并未提供初始化的方法

      可以用by-value的方式来传递内建类型的参数,但是对于一般的对象应该使用by const reference的方式,可以减少开销。

   如果异常机制按照函数被调用的顺序回查每个函数直到main()函数,仍然没有找到处理代码,那么它将调用标准库函数terminate() 。缺省情况下terminate()函数结束程序。
   一种特殊的能够处理全部异常的catch 子句如下
   
catch( ... )
   {
         // 处理所有异常,虽然它无法访问异常对象
   }

      名字空间别名(namespace alias) 允许用一个可替代的、短的或更一般的名字与一个现有的名字空间关联起来。例如:
      namespace LIB = IBM_Canada_Laboratory;      // 提供一个更一般化的别名。
      别名也可以用来封装正在使用的实际名字空间。在此情形下我们可以通过改变分配给别名的名字空间,来改变所使用的声明集,而无需改变通过别名访问这些声明的实际代码。


      using 声明提供了选择更为精细的名字可视性机制,它允许使名字中间中的单个声明可见,这样可以避免引入其余没必要的声明。例如:
         using IBM_Canada_Laboratory::Matrix;   // 只让Matrix 可见

vector的不同初始化方法:
      vector<int> vec1( size );   // 指定容量的vector
      vector<int> vec2( size, value );   // 指定容量和初始值的vector

      int ia[4] = { 0, 1, 1, 2 };
      vector<int> vec3( ia, ia+4 );
   // 利用数组来初始化vector

      vector<int> vec4( vec2 );      // vector的拷贝构造函数

vector的遍历(利用begin()和end(),分别返回指向向量“开始处”和“结束处后1 个”的迭代器):
      vector< int > vec( size );
      vector< int >::iterator iter = vec.begin();
      for ( int ix = 0; iter != vec.end(); ++iter, ++ix )
            *iter = ix;

posted on 2005-06-25 10:36  anf  阅读(326)  评论(0编辑  收藏  举报