分享

C/C++拾遗(八):未知数目输入与常引用

 千江水知 2014-04-02
      今天拿起Primer来读,虽说是入门书籍,但是才读了两章就发现有不少收获,今天下午的收获主要是利用C++解决未知数目的输入和const引用的一些注意问题。先说下C++,每门语言都会有自己的特色,从而可能相较而言更适用于某个领域或工作。但是每种高级语言共通的都会包含一些共性:数据内置类型、表达式和语句、变量、控制结构以及函数。在这些基本的功能之上,扩展增强的部分一个种方式提供给程序猿自定义数据结构的能力,另一种则是提供强大的库支持。C++提供了类机制作为自定义类型,提供了STL加速开发的效率。自己一直用C来写程序,再读Prime就更能感觉出C与C++的不同,心中也开始有点小惊喜。
     第一个程序来说明如何提供未知数目的输入,比如用户输入数字,然后给出其和。问题的关键在于如何确认用户输入结束呢?如果用C来实现的话,关键代码就是这样:
     while (getchar() != EOF || getchar() != '\n' || getchar() != '\r')
          {
               //处理过程
          }
     上述语句是针对char类型的,如果是其他类型还需要进行修改。但是在C++中可以直接利用istream对象作为while()的条件就可以了,根据定义的变量类型可以适用于各种常见类型。

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <cstdlib>
  3. //当没有使用using namespace std;时,cout,cin,endl都需要添加std::,所以还是在开头声明比较好!
  4. int main()
  5. {
  6.     int sum = 0, value;
  7.     std::cout << "Please input value :"<<std::endl;
  8.     while (std::cin >> value) //istream对象作为条件时返回的是测试流的状态
  9.     { //遇到EOF或者无效输入(类型错误)都视为istream对象无效,条件失败
  10.           sum += value; //Windows:Ctrl + Z; Linux:Ctrl + D
  11.           }
  12.     std::cout <<"The sum of inputed value is :"<<sum<<std::endl;
  13.     system("pause");
  14.     return 0;
  15. }
      这里的关键语句while(std::cin >> value)中,>>返回RHS的数值,因此返回了cin对象本身;一个istream对象作为条件式时,返回的状态就是测试流的状态,当成功读入一个value类型的数据时,测试流成功继续循环;当遇到EOF或者无效输入(其他类型数据)时测试流失败,推出循环。数据类型的判断完全交给了cin对象本身,由value类型确定。个人感觉在格式化输入输出方式上C++比C要简单多了(想想printf和scanf吧!)

     第二个程序是关于引用需要注意的一些问题。引用相当于对象的一个别名,名称不同,但实际指向同一个内存空间。所以定义时必须进行初始化绑定目标对象,普通的引用必须用同类型的对象初始化,不能使用字面值常量,如42等:
     int num = 10;
     int r_num = num;
     int r_num = 10;        //Error!
     对于一个常变量来说,不能使用普通引用绑定,因为一旦如此会造成通过引用修改常变量的可能,所以编译器会自动检查:
     const int num = 100;
     int &r_num = num;   //Error!
     对于常引用(即绑定到一个常对象的引用),引用和绑定的目标自然都是不可修改的:
     const int num = 100;
     const int &r_num = num;
     const int &r_num = 100;     //const引用可以用字面值常量初始化了
     常引用还可以绑定不同类型的对象:
    double d_num = 10000;
    const int& r_num = d_num;
    为什么呢?因为编译器其实做了以下处理:
    double d_num = 10000;
    int tmp = d_num;
    const int& r_num = d_num;
    因此常引用可以绑定不同的类型对象。当然一般来说为了避免出错,凡是const声明的对象都不要试图去修改它就可以了。特别注意,const对象一旦初始化完成是不能修改的!C++博大精深,自己还有很长的路要走

点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;

  3. int main()
  4. {
  5.     cout<<"const引用绑定到const对象"<<endl;
  6.     const int ca = 100;
  7.     const int &r_ca = ca;
  8.     cout<<"ca = "<<ca<<endl
  9.         <<"r_ca = "<<r_ca<<endl;
  10.     int vb = 99;

  11.     const int &c_vb = r_ca + vb; //常引用可以指向字面值常量,且常引用可以作为右值
  12.     cout << "c_vb is r_ca + vb is "<<c_vb<<endl
  13.          <<"vb is "<<vb<<endl;
  14.     cout<<"const引用可以绑定到不同类型对象"<<endl;
  15.     double dcc = 211;
  16.     const int &c_cc = dcc;
  17.     cout <<"double dcc is "<<dcc<<endl
  18.          <<"c_cc is "<<c_cc<<endl;
  19.     
  20.     system("pause");
  21.     return 0;
  22.     
  23. }
运行结果为:

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多