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++默认省略第一个参数(事实上是对象本身),而后一种是所有的参数都要写全。

 

 

posted @ 2011-07-29 17:05  jialejiahi  阅读(103)  评论(0编辑  收藏  举报