第3章 感受(一)——3.4. Hello world 交互版

白话C++

在“函数版”中,我向小A和老板问好。你呢?小伙子把自己关在家里苦学C++编程,精神可嘉!但我还是要非常“恶意”地推测,你写的代码是这样的:

Hello("志玲");
Hello("小翠");

究竟向谁问好,决定于你心里想的是谁——错了——决定于你在编写程序时,传给Hello()的参数值是什么。而程序编译完成,进入运行之后,就无法发生变化。如果我想换成向小B及小C问候,那就只能是:1、中止程序;2、改写程序;3、重新编译;4、再次运行。

难道,我们就没有办法,在程序运行时,再根据实际需要,来决定我们要向谁问候吗?回忆一下,现实生活你难道是见到什么都来一句:“您好,志玲?”吗?

〖轻松一刻〗:“可变”,还是“不可变”?

一 个程序要有多大的“灵活性”,主要在于需求。如果你写这个程序只是给自己使用,并且你对“志玲”情有独钟,那么一个只能打印“Hello 志玲”的程序也很适合。但如果“梁朝伟”听闻你写了一个问好程序,很开心地花100万买下它,献给了他的“嘉玲”……我们还是改写这个程序吧。

3.4.1. 变量

想要在程序运行时来点变化?是时候请出“变量”了!

变量:可以被改变的数据。当程序运行时,活动数据必须位于内存之中。要想修改内存数据的值,需要两个条件:

第一、想要改它,首先得能找到它。程序运行时,所有活动数据其实都在内存里。你想要改的数据,它生存在内存的哪个位置?内存的位置,我们称为“内存地址”。

第二、想要改它,还得在“语法”上允许。你嫌邻居家的老张的鼻子长得不好看;于是你就抓着人家去整容,这是犯法。

在C++程序中,变量就是一个数据的“内存地址”,并且C++语法规定,我们可以修改变量,要不然,它就不该叫“变”量了——应该叫“不变量”?差不多了,在C++中,那么不能变的“量”,被称为“常量”。

3.4.2. 常量

有两种常量:

第一、字面常量。就是那些你直接将值写在代码里的数据。它们之所以不可变,原因在于我们通过合乎C++伦理的手段,是不可能得到这些数据的地址的。

第二、限定常量。是指通过C++的一些“关键的词”加以修饰,从而在语法上限定某些量不可被修改。

例子,用到“字面常量”的地方有:

Hello("Xiao A");
Hello("BOSS");

其中“Xiao A”和“BOSS”这两个字符串,就是两个“字面常量”。除非改写代码,否则无论程序怎么运行,两次Hello的内容都不可变化。

例子中,在定义Hello的函数时,其参数被声明为“限定常量”:

void Hello(string const name)

“const”就是C++中一个“关键的词”,在此处它用来限定 name 不能被修改内容。(C++用这个keyword向调用者保证:放心,您传递过来的‘嘉玲’,绝对不会被修改为‘志玲’!)

3.4.3. 数据类型

原来,我们的“函数版”Hello world,仅仅使用到“变量”啊。怪不得运行时,什么也变不了呢!好,你一定急着要用用“变量”了。

别急!还有件事我们可得事先说好了:想变?可以,但你想变到什么 程度?没错,在当今世界上,“唯一不变的,就是‘变化’!”,但凡事总得有一点上限,有一点不变的原则。比如:现代医学发达,男人都可以变成女人;但如果 有一只小老鼠——比如Jerry;它若一时心情不爽,可以要求“变种”成一只猫呢?

“老鼠”和“猫”是两种不同“种类”。而跨越种类的变化,人类在伦理上其实无法接受。

“种类”,对应到C++语法,就是“数据类型”,有时也简称为“类型/type”。在C++中,完全不同类型的两个数据,不允许直接互相转换。

〖小提示〗:C++是一门“强类型”语言

C++的“强类型”体系,指的就是“类型”对数据约束很大。这一点和人类思维比较接近,符合高级语言在向“人类思维”方式靠近的说法。

不过,也有一些编程语言,在这一点上超越“人类的思维”方式,比如在一些 “弱类型”体系的语言中, 允许“Jerry”突然变成和“Tom”同种——虽然Tom会很不开心!

在C++中,要产生一个变量时,需要限定它的类型。语法格式类似:

类型 变量名;

3.4.4. 定义变量

创建一个新的C++控制台应用,项目名为“HelloWorldInteractive”。

将“函数版”中main.cpp的内容,完全复制,并替换到新版main.cpp文件的内容。也就是说,“交互版”的代码,将在“函数版”的基础上修改。

修改main()函数的内容,如下:

010 int main() 
{

012
string name = "Xiao A";
013
Hello(name);

015
name = "BOSS";
016
Hello(name);
017
return 0;
}

012行,我们定义了一个string类型的变量:name。并且立即通过“=”,将它赋值为“Xiao A”。

013行,我们调用了Hello函数,但这回我们传过去的,不是字面上的常量,而是一个变量:刚刚定义的name。

014行,为了美观,空了一行。

015行,我们修改了变量name的值,证明了“变量”真的是可变之量。

016行,重复调用Hello函数,参数仍然是name。但这时name的值是“BOSS”。

编译、运行HelloWorldInteractive项目,运行结果与“函数版”一致。虽然我们在代码中看到了变量name的值确实可以变化,但还不够直观。下面我们将它继续演进成“交互”版本,实现:运行时,用户输入名字,屏幕再打出这个名字。

3.4.5. 完成交互

之前我们一直只是在往控制台上输出内容,控制台还可以接受用户的键盘输入。和cout相对,cin是控制台程序中,对应于“标准输入设备”的C++对象。

C++标准库实现从“标准输入设备”读入一行内容的方法不少,这里选择“getline()”函数,该函数就定义在<iostream>头文件中,而原代码已经包含这一头文件。

getline需要两个参数。第一个是指定要从哪里读入,本例中当然就是cin。第二个参数指定读完后的内容,要保存在哪个变量里。

int main()
{

012
string name;
013
getline(cin, name);
014
Hello(name);

name = "BOSS";
Hello(name);
return
0;
}

012行仍然是定义了一个string类型的变量name,但这次没有直接给它赋值。

013行是调用getline函数。

014行仍然是调用我们自己定义的Hello函数,参数也同样是name。

编译、运行。程序将在启动后,等待我们输入一行文字,请输入“Xiao B”(不含双引号),然后回车,观察运行结果。

为了让程序的交互过程更直观一些,我们加一句提示。请在012和013行之间插入代码:

012    string name;
013
cout << "Please input the name: ";
014
getline(cin, name);

编译并运行程序,结果类似下图:

(图 17 交互版运行结果)

〖小提示〗:屏幕输入与文件编码无关

本例中,我从控制台屏幕输入了“志玲”,然后再通过代码回显。虽然用到了汉字,但我并不需要设置main.cpp的文件编码为“系统默认”。请思考这是为什么?

请读者将第二次获得name的代码,也改成交互版。

白话C++
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南郁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值