今天拿起Primer来读,虽说是入门书籍,但是才读了两章就发现有不少收获,今天下午的收获主要是利用C++解决未知数目的输入和const引用的一些注意问题。先说下C++,每门语言都会有自己的特色,从而可能相较而言更适用于某个领域或工作。但是每种高级语言共通的都会包含一些共性:数据内置类型、表达式和语句、变量、控制结构以及函数。在这些基本的功能之上,扩展增强的部分一个种方式提供给程序猿自定义数据结构的能力,另一种则是提供强大的库支持。C++提供了类机制作为自定义类型,提供了STL加速开发的效率。自己一直用C来写程序,再读Prime就更能感觉出C与C++的不同,心中也开始有点小惊喜。
第一个程序来说明如何提供未知数目的输入,比如用户输入数字,然后给出其和。问题的关键在于如何确认用户输入结束呢?如果用C来实现的话,关键代码就是这样:
while (getchar() != EOF || getchar() != '\n' || getchar() != '\r')
{
//处理过程
}
上述语句是针对char类型的,如果是其他类型还需要进行修改。但是在C++中可以直接利用istream对象作为while()的条件就可以了,根据定义的变量类型可以适用于各种常见类型。
-
#include <iostream>
-
#include <cstdlib>
-
//当没有使用using namespace std;时,cout,cin,endl都需要添加std::,所以还是在开头声明比较好!
-
int main()
-
{
-
int sum = 0, value;
-
std::cout << "Please input value :"<<std::endl;
-
while (std::cin >> value) //istream对象作为条件时返回的是测试流的状态
-
{ //遇到EOF或者无效输入(类型错误)都视为istream对象无效,条件失败
-
sum += value; //Windows:Ctrl + Z; Linux:Ctrl + D
-
}
-
std::cout <<"The sum of inputed value is :"<<sum<<std::endl;
-
system("pause");
-
return 0;
-
}
这里的关键语句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++博大精深,自己还有很长的路要走
-
#include <iostream>
-
using namespace std;
-
-
int main()
-
{
-
cout<<"const引用绑定到const对象"<<endl;
-
const int ca = 100;
-
const int &r_ca = ca;
-
cout<<"ca = "<<ca<<endl
-
<<"r_ca = "<<r_ca<<endl;
-
int vb = 99;
-
-
const int &c_vb = r_ca + vb; //常引用可以指向字面值常量,且常引用可以作为右值
-
cout << "c_vb is r_ca + vb is "<<c_vb<<endl
-
<<"vb is "<<vb<<endl;
-
cout<<"const引用可以绑定到不同类型对象"<<endl;
-
double dcc = 211;
-
const int &c_cc = dcc;
-
cout <<"double dcc is "<<dcc<<endl
-
<<"c_cc is "<<c_cc<<endl;
-
-
system("pause");
-
return 0;
-
-
}
运行结果为:
阅读(249) | 评论(0) | 转发(0) |