首先说下语句 cout<<“Hello“<<end;的作用,
它的作用是输出字符串Hello和换行符到屏幕,它是通过“C++的运算符重载”原理实现的。
先上代码和运行结果:
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术
#include <iostream>
using namespace std;
int main()
{
cout << "Hello!" << endl;
return 0;
}
下面开始详解这句代码。
友情提示:
下面的叙述是存在问题的,
并且有些地方说的还不够清楚,
鉴于此,
博主于2022-10-18日重写了下面的内容,
重写的版本见下面这个链接:
https://www.hhai.cc/thread-81-1-1.html
cout是标准库iostream中的定义好的一个类。
标准库iostream中的这个cout用于将字符、数字等显示到屏幕上。cout与符号"<<"配合使用就能将字符数字等显示到屏幕上。
那么为cout与符号"<<"配合为啥能产生这样的效果呢?下面就对这个问题进行解释~
我们不去探究具体的实现过程,我们只从编译器对“cout<<”的认识角度去说明这个问题!在认识这个问题前我们首先看下我们的C++是怎么使用加号“+”实现加法运算的。
C++中的任何运算都是通过函数来实现的,就连加法也不例外。比如说,“1+2”这个表达式,编译器会自动将这个表达式翻译为:“operator+(1,2);”,这个翻译的过程称为叫“运算符重载”。
翻译为“operator+(1,2);”后,实际上就是去调用了函数operator+(),进而通过函数operator+()实现了加法运算。
我们扩展一下,对于表达式“1+2+3”,等价于下面两句:
operator+(1,2);
operator+(operator+(1,2),3);
另外,C++规定,对象名的前面和后面跟一个操作符等价于“对象.操作符”,如果a是一个对象,那么a++等价于a.++再等价于“a.operator++();”
明白以上三点后,我们回到题目中提到的语句“cout<<"Hello!"<<endl;”,对于编译器而言,
“cout<<"Hello!"<<endl;”等价于下面这句:
cout.<<"Hello!".<<endl;
再等价下面这句话:
cout.operator<<("Hello!").operator<<(ednl);
再等价于下面这两句话:
cout.operator<<("Hello!");
cout.operator<<("endl");
有同学要说“cout”是类名啊,不是对象啊,怎么能这么用呢?其实是可以的,当用类名直引用其成员函数时,会产生临时对象,这个临时对象咱们看不见。
最后,说下“endl”的作用,它用来向缓冲区插入换行符号并刷新。我们可以从下面两个例子的输出结果对比来体会“endl”的作用。
#include <iostream>
using namespace std;
int main( )
{
cout<<"Hello!"<<endl;
return 0;
}
运行结果:
#include <iostream>
using namespace std;
int main( )
{
cout<<"Hello!";
return 0;
}
运行结果:
最后,再总结一下,为什么语句“cout<<"Hello!"<<endl;“能输出字符串Hello和换行符到屏幕,那是因为用到了C++中的运算符重载的功能,实际在编译和运行时,符号“<<”重载成了相应的函数。