Day1
《第二章:开始学习C++》
这一章主要是对C++的基本结构做一些概述,许多只是一带而过,在书籍《C++Primer Plus》的后面应该会细讲,主要是以下这些内容:
- 预处理器编译指令#include
- 编译指令using namespace std
- 头文件和命名空间
- cin、cout、endl
- 函数
- 编程练习
1.预处理器编译指令#include
主要是在主编译之前对源文件进行处理,比如:
#include <iostream>
这是预处理器将iostream文件的内容田间到程序中。那么为何要将iostream文件的内容添加到程序呢?答案涉及到程序与外部世界之间的通讯。这里的io是指输入与输出;#include编译指令使得iostream文件的内容随源代码文件内容一起被发送给编译器,iostream文件的内容将取代上述程序中的代码行,原文件没有被修改,而是将源代码文件和iostream组合成一个复合文件,编译的下一个阶段将使用该文件。另外,使用cin和cout进行输入输出时,必须包含文件iostream。
2.编译指令using namespace std
其实可以和名称空间结合起来理解。书上翻译的是叫做名称空间,可能平时大家看到的更多称之为命名空间(也不知道我这么理解对不对)。
using namespace std;
这条语句的操作叫做导入命名空间,这条指令的目的是为了使得std命名空间中的所有名称可用;当然,目前的比较严谨的理念是,只让需要访问命名空间的std函数访问它,这跟编译指令using放的位置有关,也与其编写形式有关,下面举4种例子:
第一种:放在函数定义之前,让文件中所有的函数都能使用命名空间std中所有元素
#include <iostream>
using namespace std;
int main()
{
cout << hello,world!<<endl;
return 0;
}
第二种:放在特定的函数中,让该函数能够使用命名空间std中所有元素
#include <iostream>
int main()
{
using namespace std;
cout << hello,world!<<endl;
return 0;
}
第三种:让函数只能使用指定的元素,
#include <iostream>
using std::cout;//注意此处写法,不加namespace
int main()
{
cout << hello,world!<<endl;//由于using编译指令指定了cout,所以文件下所有函数只能用cout,其他未指定的,比如cin就用不了
return 0;
}
第四种:完全不用编译指令using,在需要使用命名空间std中元素时,使用前缀std::
#include <iostream>
int main()
{
std::cout << hello,world!<< std::endl;
return 0;
}
3.头文件以及命名空间
关于头文件:
目前C++的用法是,对老式C的头文件保留了扩展名h(C++程序仍然可以使用这种文件),而C++头文件没有扩展名。有些C头文件被转换未C++头文件,然后重新命名,去掉了扩展名h,在文件头加上c,例如C++版本的math.h为cmath。
关于命名空间:
意义在于,如果使用两个已封装好的产品,而他们都包含一个名为wanda()的函数,这样在使用wanda()函数的时候,编译器不知道指的是哪个版本。命名空间能够让厂商将其产品封装在一个叫做命名空间的单元里,这样就能够按照命名空间来区分:
Microflop::wanda("go dancing?");//用了Microflop的版本下函数
Piscine::wanda("a fish named ss");//用了Piscine的版本下函数
按照这种方式,类、函数和变量便是C++编译器的标准组件,他们现在都被放置在命名空间std中(仅当头文件没有扩展名h时,情况才是如此。“说实话书里的这句没太理解其含义”)。因此在iostream中用于输出的cout其实是std::cout,cin其实是std::cin。那么这样也就可以解释为什么出现了using指令,因为用户们懒得总去加上std::,为了偷懒,using指令应运而生,在一开始直接using namespace std,后面就可以直接使用。
4.cin、cout、endl
这三个应该是一开始接触最多的,涉及到输入输出流、运算符重载等一些底层的知识,目前理解不深,仅做一些现有认知的描述。
cin和cout都是智能对象,cin能够将键盘输入的一系列字符转化为接收信息的变量能够接受的形式。而cout则可以对比C语言中的printf,printf里面会用%d,%s去格式化输出,如果提供的类型不对,就会报错,而cout就不会。
endl主要提一个点就是,他和\n的区别。一般来说,显示用引号括起的字符串时,通常用\n,其余的则用控制符endl。endl确保程序继续运行前刷新输出(将其立即显示在屏幕),而\n不行,这就意味着在有些系统中,有时候可能在您输入信息后才出现提示。当然网上查了一些更专业的说法可以看一下endl的定义:
template<class _Elem,class _Traits> inline basic_ostream<_Elem, _Traits>&
__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
{
// insert newline and flush stream
_Ostr.put(_Ostr.widen('\n'));
_Ostr.flush();
return (_Ostr);
}
那么这里可以看到有一个flush的操作,“flush:刷新缓冲区,把流从缓冲区输出到目标设备,并清空缓冲区”,即可理解上述。当然深层次的关于endl可以参考C++中endl的本质是什么
5.函数
这里直接上题目吧,后面的题目基本都是用到了函数
///第三题
#include <iostream>
using namespace std;
void show_mice();
void show_running();
int main()
{
show_mice();
show_mice();
show_running();
show_running();
system("pause");
return 0;
}
void show_mice()
{
cout << "Three blind mice" << endl;
return ;
}
void show_running()
{
cout << "See how they run" << endl;
return;
}
///第四题
#include <iostream>
using namespace std;
int main()
{
int age;
cout << "Enter your age:";
cin >> age;
cout << "your age include " << age * 12 << " months"<<endl;
system("pause");
return 0;
}
///第五题
#include <iostream>
using namespace std;
double wendu(double a);
int main()
{
double Cvalue;
cout << "Please enter a celsius value: ";
cin >> Cvalue;
cout << Cvalue << " degrees Celsius is " << wendu(Cvalue) << " degrees Fahrenheit.";
system("pause");
return 0;
}
double wendu(double a)
{
return 1.8 * a + 32.0;
}
///第七题
#include <iostream>
using std::cout;
using std::cin;
void showtime(int h, int m);
int main()
{
int hour, minute;
cout << "Enter the number of hours: ";
cin >> hour;
cout << "Enter the number of minutes: ";
cin >> minute;
showtime(hour,minute);
system("pause");
return 0;
}
void showtime(int h, int m)
{
cout << "Time: ";
cout << h;
cout << ":";
cout << m;
return;
}
总结:第一次写博客,感觉还是很不错,在学习了知识以后确实需要通过一种途径将其分享出去,分享的过程中一方面回顾了知识,另一方面也找到了原来看书掠过或者没太注意的地方,当你要把它写出来的时候就会发现糊弄不过去了,得老实的去看。总的来说第一天坚持下来了,明日继续!
最后说一句,草塔吗的真冷啊!!!