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声明内联函数。
4 普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用
5 引用是一种没有指针语法的指针, 因此对于对象的引用&rhs的使用我们写成rhs._size,而不是rhs->_size 。
6 每个类对象在被程序最后一次使用之后 它的析构函数就会被自动调用
7 为了把一个类设计成基类 要做的第二个设计考虑是找出类型相关的成员函数 并把这
些成员函数标记为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