C++ Primer chap2

1 new 运算符的用法:

  分配一个整型 int *pint = new int (1024); (1024 是初始值)。

  分配一个整型数组 int *pia = new int [8];  (八个元素)。

对应的delete语句: delete pint; delete [] pia;

2 友元函数可以访问类private部分的成员。

3 在类中定义的函数自动被当做是内联函数,也可以在外面用inline声明内联函数。

普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用

 引用是一种没有指针语法的指针, 因此对于对象的引用&rhs的使用我们写成rhs._size,而不是rhs->_size 。

 每个类对象在被程序最后一次使用之后 它的析构函数就会被自动调用 

 为了把一个类设计成基类 要做的第二个设计考虑是找出类型相关的成员函数 并把这 

些成员函数标记为virtual虚拟的。对于类型相关的成员函数 它的算法由特定的基类或派生类的行为或实现来决定 例如  

对每种数组类型 下标操作符的实现是不同的 所以 我们将它声明为Virtual   

8 把参数传递给基类的构造函数:

inline IntArrayRC::IntArrayRC( const int *iar, int sz ) 

: IntArray( iar, sz ) {} 

9 虚拟函数比非虚拟函数的效率要低一些因为它们不能被内联 内联发生在编译时刻 而虚拟函数是 

在运行时刻被处理的 

10 泛型编程 template < class elemType >  关键字template 引入模板 参数由一对尖括号 <    >    括起来——本例中 有一个参数 

elemType,关键字class 表明这个参数代表一个类型,标识符elemType 代表实际的参数名。

11 程序中异常出现的点, 一旦识别出程序异常, 就会导致抛出 raise 或 throw 异常,异常被抛出时,正常的程序就被挂起,直到异常被处理完毕。典型地,程序异常的抛出与处理位于独立的函数或成员函数调用中,找到处理代码通常要涉及到展开程序调用栈 Program call stack; 一旦异常被处理完毕,就恢复正常的程序执行。

例子:

int* stats( const int *ia, int size )
{
 int *pstats = new int[ 4 ]; 
 try {
  pstats[ 0 ] = sum_it( ia, size );
  pstats[ 1 ] = min_val( ia, size );
  pstats[ 2 ] = max_val( ia, size );
 }
 catch( string exceptionMsg )
  {/* 处理异常的代码 */} 
 catch( const statsException &statsExcp )
  {/* 处理异常的代码 */} 
 
 pstats[ 3 ] = pstats[ 0 ]/size;
 do_something( pstats );
 
 return pstats;
}

12 名字空间机制允许我们封装名字,如

namespace Cplusplus_Primer_3E {
template <class elemType>
 class Array { ... };
 // ...
}

可以给名字空间起一个别名

namespace LIB =  Cplusplus_Primer_3E;

用using引用名字空间。

13 向量是一个类模板 所以我们这样写 :

// 创建 vector 对象的各种方法
需要#include <vector> 


vector<int> ivec( 10 ); // 上面的代码分别定义了一个包含 10 个整型对象的向量 
vector<string> svec( 10 );//1个包含10 个字符串对象的向量 

vector<int> veco; // 空的 vector

const int size = 8;
const int value = 1024;
 
// size 为 8 的 vector
// 每个元素都被初始化为 0
vector<int> vec1( size );
 
// size 为 8 的 vector
// 每个元素都被动始化为 1024
vector<int> vec2( size, value );
 
// vtc3 的 size 为 4
// 被初始化为 ia 的 4 个值
int ia[4] = { 0, 1, 1, 2 };
vector<int> vec3( ia, ia+4 );
 
// vec4 是 vec2 的拷贝
vector<int> vec4( vec2 );

下面的代码显示了怎样把各种各样的泛型算法应用到 vector 类对象上 
#include <vector>
#include <algorithm>
#include <iostream>
int ia[ 10 ] = {
 51, 23, 7, 88, 41, 98, 12, 103, 37, 6 };
 
int main()
{
 vector< int > vec( ia, ia+10 );
 
 // 排序数组
 sort( vec.begin(), vec.end() );
 
 // 获取值
 int search_value;
 cin >> search_value;
 
 // 搜索元素
 vector<int>::iterator found;
 found = find( vec.begin(), vec.end(), search_value );
 if ( found != vec.end() )
  cout << "search_value found!\n";
 else cout << "search_value not found!\n";
 
 // 反转数组
 reverse( vec.begin(), vec.end() );
 
 // ...
}

     本章大致地讲述了C++为数据抽象(基于对象的程序设计), 面向对象的程序设计 泛型程序设计(模板 容器类型以及泛型算法)大型程序设计 (异常处理与名字空间)提供的支持 而本书余下的部分将更详细地介绍这些内容 逐步讲解 C++中基本 但又非常先进的特性 

未完...2.6

posted @ 2011-07-28 23:08  jialejiahi  阅读(240)  评论(0编辑  收藏  举报