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

  • 相关阅读:
    序例化-Externalizable 接口
    线程休眠
    线程优先级
    const & 用法
    AcGePoint3d ads_point 转换
    结果缓冲区 resbuf具体用法
    选择集用法
    引用用法
    通过用户选择获取各种东西
    ARX中类型强制转换
  • 原文地址:https://www.cnblogs.com/liujiahi/p/2196388.html
Copyright © 2011-2022 走看看