写在前面:在近期会发布较多的学习笔记,记录个人学习新语言的心得,文章中有不妥之处,还望交流指正
目录
了解C++
一、了解IDE
1)与其它语言的区别
1.C++编译时对大小写敏感,区分大小写,在关键字的使用时需要注意
2.C++必须要包含一个名为main()的函数(此处小写),函数头作为接口,从int main()开始
3.cpp文件的执行通常从main()开始
4.输出与输入语句为cout与cin
5.C++对一些老式头文件作了重新命名,去掉了扩展名h,并在文件名前添加了前缀c(方便多平台使用时不报错,且可使用一些C不具备的特性,例如使用名称空间using namespace std)
老版:
#include <math.h>
新版:
#include <cmath>
2)输出语句cout详解
在了解输出语句前,先得对这行代码有初步认识:
#include <iostream>
其中io表示IN/OUT,即输入输出,include语句在cpp执行时预处理了iostream文件,将其加载到了我们的cpp中,从而让我们能够使用输出变量cout和输入变量cin
而形如下列的代码,则是对名称空间的使用:
using namespace std;
名称空间的定义是为了区分不同的已封装好产品的同名函数,此处采取书上的例子:如果Microflop和Piscine公司都使用了同名的wanda()函数,编译器将不知道是哪个版本,这时候可以使用名称空间将它们区分开来:
using namespace Microflop;
using namespace Piscine;
这样wanda()函数的全称就为Microflop::wanda()和Piscine::wanda(),从而可以进行区分
Microflop::wanda("Hello World");
Piscine::wanda("Hello Wuhan");
在这种方式下,类、函数、对象是C++编译器的标准组件,都被放在名称空间std下,仅当头文件名没有.h时,情况才是如此
因此可以知道在iostream中定义的用于输出的变量cout和用于输入的变量cin的全称为std::cout和std::cin,当省略using语句时,则可以用全称进行编码
cout是C++中的一个预定义的对象,知道如何显示字符串、数字和单个字符等。相比于C的printf(),不用担心%s,%d输出类型打错后导致的乱码,这得益于插入运算符<<的使用,插入运算符表明了信息流动的方向,如下:
using namespace std;
cout<<"Hello World";
对输出的理解是,输出是一个流,是从程序流出的一系列字符,cout对象表示这种流。<<表明了将右侧信息插入到左侧的输出流中
值得一提的是,<<会识别右侧的数据类型,进行智能化的输出,在后文变量的有关内容中会提及
在实际使用中,也会遇到这样的输出:
using namespace std;
cout<<"Hello World"<<endl;
打印字符时,cout不会自动移到下一行,而上面代码中的endl是控制符,起到的作用是重启一行,会使屏幕光标移到下一行的开头。它的定义也是来自于头文件iostream,全称是std::endl,相比于C中的\n,endl保证在程序继续运行前刷新输出(立即显示在屏幕上),而\n不能提供这样的保证,也意味着在某些系统中,在输入信息后才会出现提示
cout同时支持拼接输入,如下:
using namespace std;
cout<<"Hello "<<"W"<<"orld";
cout<<"Hello World";
两行代码的输出内容是一样的
鉴于不输入endl不会进行换行,而是接在上一次输出的结尾接着输出的特点,如下语句也能达成上面代码的输出:
using namespace std;
cout<<"Hello";
cout<<" ";
cout<<"World";
3)C++源码格式化
C++中分号标示了一行的结尾,这点跟java一致,也说明了在C++中,回车的作用跟空格或制表符相同,一行语句可以分几行实现,如下:
using
namespace std; cout
<<
"Hello World"
;
此处仅说明代码有效,方便阅读他人代码,笔者个人不推荐在实际应用中采取如上形式的代码。
补充之处在于C++源代码中与函数名称相关的圆括号周围没有空白
4)变量的声明与赋值
定义变量都不陌生,此处补充的只是底层逻辑,如下:
int sum;
int表明了创建的变量类型为整型,诸如此类的声明还有double、float、char、string,当程序执行到这一条语句时,通过读取int,知道需要的空间大小为一个整型,从而会为这个变量分配足够大小的内存空间来存储这样一个整数,读取到sum时,会给存储单元指定名称,用sum来标识存储在该内存单元中的值。变量意味着值能进行修改,在C++中,所有变量必须声明。
C++的变量声明分为两种:定义声明(defining declaration)、引用声明(reference declaration)
上面代码中使用的是前者,即定义声明——在程序中直接声明。
C++的赋值运算符采用的是= 即将等式右边的值赋值给左边,特殊之处在于可以连续使用赋值运算符,如下:
int a;
int b;
int c;
a=b=c=99;
赋值的进行是先将99赋值给c,再给b,再给a,过程应该是易于理解的
变量的加减与其它IDE并无明显区别,此处不过多赘述
补充前文提到的<<智能化识别,<<在C中,也是移位运算符,而它也可在C++中作插入运算符使用,这种我们称之为重载运算符,其功能会结合代码执行的内容和上下文而采取移位/插入操作,而<<在插入操作时,对右侧的内容其实会进行智能化识别,如下:
using namespace std;
int sum=99;
cout<<sum;
输出结果将是99,但此时的99其实是字符串,即<<识别到右侧的int数据后根据输出的要求,将二进制内容的整数转化为了对应的字符'9'和'9'并拼接起来形成“99”,再进行的输出,cout能够识别类型的功能表明,其设计更灵活,同时,它是可扩展的,即可重新定义<<运算符,使cout能够识别和显示新开发的数据类型
5)输入语句cin详解
C++的输入语句是cin,用法如下:
using namespace std;
int sum;
cin>>sum;
其中,>>表明了信息流动的方向,表明将输入流传到了变量sum中
与cout一样,cin也是智能对象,可以识别键盘输入的字符串,转换为>>右侧变量能够接受的形式
6)函数详解
C++中除了必备的函数main()外,使用函数除了库函数外,用户定义的函数需要在main()前提供其原型,在main()后提供源代码,如下:
#include <iostream>
void target(int);
int main()
{
using namespace std;
target(6);
int newtarget;
cin>>newtarget;
target(newtarget);
cout<<"done"<<endl;
return 0
}
void target(int n)
{
using namespace std;
cout<<"your target is "<<n<<",keep going!"<<endl;
}
其中include下面一行的void target是原型,括号中声明了参数类型,而main()后面的void target(int n)是源代码,展示了具体的实现内容
在上面的代码中需要注意的部分有:
1.void的使用:void意味着不接受参数,在函数类型前面声明意味着无需返回值,在函数类型后的括号中声明意味着不接受任何参数,如下:
void status(int n)
{
statement;
} //无需返回值
status(6);
int state(void)
{
statement;
return 0;
} //无需任何参数
int sum=state();
无需返回值的函数结尾不需要带上return语句,这类函数也被称为过程(procedure),也因为其不返回值,所以无法用在赋值语句或其它表达式中
在C++中需注意,即使函数调用中不需要参数,在调用时也需要加上括号,如上面代码中的state();
2.namespace的使用:在上列代码中,每个函数中都using了一次namespace,有没有方法能避免这种重复呢?方法就是在最初的函数头中using即可,如下:
#include <iostream>
using namespace std;
void target(int);
需要注意的是,using namespace std时会使用std名称空间下的所有名称可用,在大型工程文件中可能会是潜在的问题,所以建议仅使我们所需的名称可用,如下:
using std::cout;
using std::cin;
using std::endl;
用这些指令替代using namespace std;便可以使用cin和cout而不用加上std::
3.return的用法
return 0 在函数中意味着函数无故障顺利执行,这里的返回值也可以作修改,如:
int KmToM(int n)
{
int meter=n*1000;
return meter;
}
如上的千米到米的转化函数,可以return变量meter的值,也可以进行如下实现:
int KmToM(int n)
{
return n*1000;
}
输出结果也是一致的,唯一需要注意的是两个方面:参数类型需要是整型,返回时的输出需要是整型,这取决于我们最初的函数定义
相比之下,第一个函数的实现将计算和返回分开了,更有利于修改