C++ Primer chap3
1 用wchar_t 类型处理宽字符,可以这样声明 whcar_t c = L'A'; 占四个字节。
2 声明变量时同时初始化:
(1)显式
int ival = 1024;
string project = "Fantasia 2000";
(2 )隐式
int ival( 1024 );
string project( "Fantasia 2001" );
(3)每种内置数据类型都支持一种特殊的构造函数语法,可将对象初始化为0, 例如
// 设置 ival 为 0 dval 为 0.0
int ival = int();
double dval = double();
下列定义中
// int() applied to each of the 10 elements
vector< int > ivec( 10 );
函数int()被自动应用在 ivec 包含的10 个元素上
3 string s1("hello");
const char *s = s1.c_str();
4 关于const 类型。
(1)C中可以用非const 的指针指向const 类型的变量,并且通过该指针修改(报警告),不过这明显是不合理的,应该避免。
C++中非const 的指针不能指向const 类型的变量。
(2)注意与typedef结合使用时容易犯的错误。
如果有typedef char *Cp;
那么const Cp p;以后p的类型是char * const p; 而不是const char *p;
5 引用 reference 有时候又称为别名 alias 它可以用作对象的另一个名字
引用类型由类型标识符和一个取地址操作符来定义 引用必须被初始化
int ival = 1024;
// ok: refVal 是一个指向 ival 的引用
int &refVal = ival;
// 错误 引用必须被初始化为指向一个对象
int &refVal2;
// ok: refPtr 是一个指向指针的引用
int *&ptrVal2 = pi;
const引用可以用不同类型的对象初始化 只要能从一种类型转换到另一种类型即可
也可以是不可寻址的值 如文字常量 例如
double dval = 3.14159;
// 仅对于 const 引用才是合法的
const int &ir = 1024;
const int &ir2 = dval;
const double &dr = dval + 1.0;
同样的初始化对于非const引用是不合法的 将导致编译错误 原因有些微妙 需要适
当作些解释:引用在内部存放的是一个对象的地址 它是该对象的别名 对于不可寻址的值 如文字
常量 以及不同类型的对象 编译器为了实现引用 必须生成一个临时对象 引用实际上指
向该对象 但用户不能访问它 例如 当我们写
double dval = 1024;
const int &ri = dval;
编译器将其转换成
int temp = dval;
const int &ri = temp;
如果有 const int ival = 1024; 如果用ival的地址初始化一个引用,该怎么声明其引用呢?
// ok: 这是可以被编译器接受的
const int *const &pi_ref = &ival;
实际的 C++程序很少使用指向独立对象的引用类型 引用类型主要被用作函数的形式参
数 例如
// 在实际的例子中 引用是如何被使用的
// 返回访问状态 将值放入参数
bool get_next_value( int &next_value );
// 重载加法操作符
Matrix operator+( const Matrix&, const Matrix& );
6 C++ 的枚举类型与C里面的有不同,不可以C里面可以直接把整型赋值给枚举变量,而C++中不可以。
C中的枚举类型可以作自加运算,而C++中的不可以。
7 没有引用数组,C和C++中的数组都不做越界检查,不过如果出现int a[2] = {1, 2, 3};这样的情况,C会报编译警告,C++会编译报错。
对char *str[5] = "hello";这样越界错误的检查C++要比C严格一些。
8 对vector 的遍历习惯使用迭代器,iterator 是标准库中的类 它具有指针的功能 。 *it; 对迭代器解引用 并访问其指向的实际对象
for ( vector<string>::iterator it = text.begin();
it != text.end(); ++it )
cout << *it << ' ';
cout << endl
9 任何一个插入操作都将增加vector 的大小
const int size = 7;
int ia[ size ] = { 0, 1, 1, 2, 3, 5, 8 };
vector< int > ivec( size );
for ( int ix = 0; ix < size; ++ix )
ivec.push_back( ia[ ix ]);
程序结束时ivec 包含14 个元素 ia 的元素从第八个元素开始插入 。
10 pair 类也是标准库的一部分 它使得我们可以在单个对象内部把相同类型或不同类型的
两个值关联起来 为了使用pair 类 我们必须包含下面的头文件
#include <utility> 例如
pair< string, string > author( "James", "Joyce" );
创建了一个pair 对象author 它包含两个字符串 分别被初始化为 James 和 Joyce
我们可以用成员访问符号( member access notation ) 访问pair 中的单个元素 它们的名
字为first 和second 例如
string firstBook;
if ( author.first == "James" &&
author.second == "Joyce" )
firstBook = "Stephen Hero";
11 运算符的重载有两个方式,一种是做为成员函数,另一种是做为友无函数。前种C++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。