为什么要学习c++
C++被称为带类的C,是一种面向对象的程序设计语言,面向对象的机制是C++与C最大的去别,在我们的培养方案上,在经过大一上学期学习C后,C++就提上来日程。
由于大一的我们已经系统的学习过C语言,学习记录只会记录一些C和C++的不同,请谅解
Hello world
和C语言一样,编写的第一个代码又是Hello world
#include <iostream>
using namespace std;
int main()
{
cout <<"Hello world .\n";//cout 是c++新引入的一种输出方式
printf ("Hello world .");//脱胎于C的c++也保存了C语言的输出方式。
return 0;
}
在这里我使用了printf,和cout两种方式输出hello world。cout既不是C++语言的一种关键字,也不是一个函数,cout是C++的一种输出流对象,对于几种输出流这里先不做解释。
从一个例子看C和C++的区别与联系
#include <iostream>
using namespace std;
int max(int x,int y);
int min(int x,int y);
int main ()
{
int a,b,c,d;
cout<<"请输入你想计算的两个数。"<<endl;
cin>>a>>b;
c=max(a,b);
d=min(a,b);
cout<<"两个数的最大公约数为"<<c<<endl;
cout<<"两个数的最小公倍数为"<<d<<endl;
}
int max(int x,int y)
{
int i=1,j=0;
for (i; i<=x; i++)
{
if (x%i==0&&y%i==0)
j=i;
}
return j;
}
int min (int x,int y)
{
int i=x,j;
for (i; ; i++)
{
if (i%x==0&&i%y==0)
return i;
}
}
最为明显的去别是输入输出上的不同,C++使用的是cin,cout,这是C++关于C进步的一点,相较于printf和scanf两种,C++中的输入输出是类型安全的,C语言采用函数实现输入输出,而C++采用类对象实现输入输出。关于C++输入输出流的具体内容,我们后面在进行探讨。
还有一点相同,对函数的声明,定义及调用,C++与C基本一致。
在数据的储存、表达形式和基本运算中的不同
常变量
在C++程序中,在定义变量时,如果使用了关键字const,这个变量就被定义为了常变量,类似于C里用#define定义的符号常量,符号常量在C++里得到了保存,值得一提的是虽然实现的方式不同,但是都可以认为是用一个标识符代替一个常量。
强制类型转换符
在C++中强制类型转换变得更加便捷,例如
double max=3.1415926;
int y=5
cout <<y+int (max)<<endl;
在这里通过强制类型转换,将double类型的max转换成int类型的中间变量,通过强制类型转换可以使double类型数据向下取整,参与模运算。
布尔型(bool)
布尔型即逻辑型,C语言中没有特定的逻辑型数据,关系表达式的真或假用1或0来表示。C++中增加了逻辑型,它的值只能是true或false中的一个。
值得一提的是在C++中直接使用语句输出true或false
bool flag =true;
cout<<flag;
这样输出的结果是1,即表示在运算过程中编译系统将逻辑型数据看做0或1,同时如果将一个非零数字赋值给布尔变量,随后输出这一变量,得到的是1,即将非零数赋予bool变量,这个变量会按照true进行处理。
如果想要在输出时输出true或false则需要使用操纵符,再输出语句中插入操纵符boolalpha可以强制要求输出true和false。
在利用函数实现指定功能上的不同
内置函数
在调用函数时需要一定的时间和空间的开销,在C++中提供了一种高效率的方式,即编译时将主调函数的代码嵌入到主调函数中,这种方法称为内置函数。
内置函数需要在函数左侧添加关键字inline。
需要注意内置函数,不能包括复杂的循环语句和switch语句,并且inline声明是一个建议性质的声明,不是指令性质的,如果编译系统发现函数不适合使用内置的方式,函数将忽略inline声明。
函数的重载
C++中允许同一函数名定义多个函数,而这些函数的参数个数和参数类型可以不相同。
例如
#include <iostream>
using namespace std;
int main()
{
int max(int a,int b,int c);
double max (double a,double b,double c);
int i1,i2,i3,i_max;
cout<<"请输入三个整形数。"<<endl;
cin>>i1>>i2>>i3;
i_max=max(i1,i2,i3);
cout<<"三个数中的最大值为"<<i_max<<endl;
double d1,d2,d3,d_max;
cout<<"请输入三个实数型数"<<endl;
cin>>d1>>d2>>d3;
d_max=max(d1,d2,d3);
cout<<"三个数中的最大值为"<<d_max<<endl;
return 0;
}
int max(int a,int b,int c)
{
if(b>a)a=b;
if(c>a)a=c;
return a;
}
double max(double a,double b,double c)
{
if(b>a)a=b;
if(c>a)a=c;
return a;
}
在这个例子中,我们将两个比大小的函数都定义为了max,在函数的调用时系统会根据实参的类型找到与之相匹配的函数。
这就要求,重载函数的参数个数,参数类型或参数顺序中必须至少有一种不同,函数的返回值可以相同也可以不同。
函数模板
所谓函数模板实际上是建立一个通用函数,其函数类型和形参类型不具体确定,用一个虚拟的类型来代替。
通用的函数模板定义为 template <typename T>或template <class T>。
在刚刚使用函数重载编写的程序,使用函数模板实际上更加简洁,但是函数模板只适用于,函数体相同,函数的参数个数相同而类型不同的情况。
就刚刚上面的那个代码使用函数模板写更简洁
template <class T>
T max (T a,T b, T c)
{
if (b>a)a=b;
if(c>a)a=c;
return a;
}
在这种题目中,一个函索模板会比函数重构减少大量的工作量。
如果觉得上面情况里重构和函数模板工作量差不多,我这还有道开学后pta的习题
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
int add(int a,int b)
{
int num;
num=a+b;
return num;
}
double add(double c,double d)
{
double num;
num=c+d;
return num;
}
string add(string s1,string s2)
{
string num;
num=s1+s2;
return num;
}
int main()
{
int a, b;
double c, d;
string s1, s2;
cin >> a >> b;
cin >> c >> d;
cin >> s1 >> s2;
cout << add(a, b) << endl;
cout << fixed << setprecision(2) << add(c, d) << endl;
cout << add(s1, s2) << endl;
return 0;
}
有默认参数的函数
在C++中可以使用默认参数作为函数的实参,即给形参变量一个默认值,但是这个默认值是可以由传入参数进行更改,需要注意这个时候指定的默认值的参数必须放置在形参列表的最右端。否则容易出错。
对于C语言和C++在头文件上的不同
C++的头文件不在包括.h后缀,但是又考虑向下兼容C的需要,C++语言就有了两套头文件,例如math.h和cmath,这两个头文件的效果是完全一样的。
字符串类和字符串变量
C++提供了一种不同于C的新的数据类型,string类型,即字符串类型。但是需要注意的是string类型并不是C++的一种基本类型,