一、C++对C的扩充
1.C++的输入输出
1.1用cout输出
cout<<"Hello World!!!\n";
//将Hello World!!!打印在屏幕上并换行
cout<<"Hello World!!!"<<endl;
//将Hello World!!!打印在屏幕上并换行
1.2用cin进行输入
int a;
float b;
cin<<a<<b;//从键盘中以此读入以空格分开的数字放入a b变量中,
2.C++定义常变量
2.1C语言常用#define定义常量
#define PI 3.1415926
注意:实际上编译器在预编译时将程序中出现的字符串PI全部替换成3.1415926,预编译之后,不再有PI这个标识符,PI不是变量,没有类型,不占用存储单元。
2.2C++语言常用const定义常变量
const float PI = 3.1415926;
注意:PI是常变量,有数据类型,占用内存空间,有地址,可以用指针指向它,可以理解为程序运行期间值不可以改变的变量。
3.函数原型声明
3.1C语言的函数声明
int max(int x,int y);
int max();
max(); //若max返回值为整形,可以省略
3.2C++的函数声明
C++中,如果调用函数在函数定义之前,必须对调用的函数作函数声明的严格检查
声明形式:函数类型 函数名(参数列表)
int max(int x,int y);
int max(int ,int );
4.函数的重载
函数重载:在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名函数用来实现不同的功能,即一函数名多用。
C++将C语言中的“<<”和“>>”左右移运算符进行了重载,变成了输入输出运算符,这称为运算符的重载
函数重载条件:
①作用域相同
②函数名相同
③参数个数不同或者参数类型不同
例:求三个数中的最大数(分别考虑整数、实数、长整数情况)
int max(int a,int b,int c){
if(b > a) a = b;
if(c > a) a = c;
return a
}
float max(float a,float b,float c){
if(b > a) a = b;
if(c > a) a = c;
return a
}
long max(long a,long b,long c){
if(b > a) a = b;
if(c > a) a = c;
return a
}
5.函数模板
函数模板:建立一个通用模板,它的函数类型和参数类型不具体指定,用一个虚拟的类型来取代,这个通用的函数就称为函数模板。
优点:用一个模板函数取代了函数重载中的多个函数,减少了代码的冗余。
例:求三个数中的最大数(分别考虑整数、实数、长整数情况)
template <typename T> //模板声明,T为虚拟类型
//template<class T> //模板声明的另一种形式
T max(T a,T b,T c){ //定义一个通用函数,用T作虚拟类型名
if(b > a) a = b;
if(c > a) a = c;
return a
}
void fun(T x,T y){
}
使用函数模板的条件:参数个数相同
6.有默认参数的函数
简单来说就是可以给函数形参列表中的变量赋初始值,调用函数时可以不传入实参
要求:
①有默认值的形参必须位于无默认值的形参之后
②调用有默认参数的函数时,传入的实参个数必须大于等于无默认值得形参个数
void fun1(int a = 0, int b,int c = 3)//错误
void fun2(int b,int a = 0,int c = 3)//正确
fun2()//传入的实参个数为0,不合法
fun2(3);//合法
fun2(3,4);//合法
fun2(3,4,5);//合法
③一个函数不能同时作为重载函数和有默认值的函数,会引发二义性,系统无法执行
int max(int a,int b,int c = 100){}
int max(int a,int b){}
max(1,2)//产生二义性,系统无法确定调用的是哪一个函数
7.变量的引用
变量的“引用”(reference)就是给变量取一个别名
int a = 10;
int &b = a; //这里b就是a的引用变量
图解:
这里对b进行操作就相当于对a进行操作,这里a、b共享同一片内存地址,内存中存的是10,不过是同一片内存地址的两个名字,分别叫a、b
作为函数形参,作用类似于指针
void swap(int *a,int *b){ //利用指针交换两个数
int temp = *a;
*a = *b;
*b = temp;
}
void swap(int &a,int &b){ //利用引用交换两个数
int temp = a;
a = b;
b = temp;
}
使用引用需要注意
①声明引用必须对它初始化,即将它与另一个变量联系起来
int a = 10;
int &b; //不合法,未初始化
int &c = a; //合法
②一旦引用被初始化,它便不能再次引用其他变量
int a = 10;
int b = 10;
int &c = a;
int &c = b; //不合法,c已经是a的别名了
③const修饰引用后,不能通过引用修改值,但是可以通过原来的变量修改值
int a = 10;
const int &b = a;
b = 20; //不合法,b被const修饰,无法改变其中的值
a = 20; //合法,a未被const修饰,可以改变其中的值
8.内置函数(内联函数)
问:为什么有内联函数?
答:由于在主函数中调用其他函数需要函数压栈,函数调用完后需要函数弹栈,会消耗一定时间,使用内联函数可以提高代码运行效率。
内置函数的解释:内置函数相当于将函数镶嵌到函数调用的位置,可以内置函数看成,在函数内部的一个函数,只不过这个函数代码写在函数外部。
关键字:inline
inline int sum(int a,int b){
return a+b;
}
int main(){
int Sum = sum(3,6);
return 0;
}
//相当于:
int main(){
int a = 3;
int b = 6;
int Sum = a+b;
return 0;
}
上述代码运行时,编译器会将内联函数看成主函数中的一部分代码,从而省去了sum函数的压栈弹栈时间,提高了效率
9.作用域运算符::
每一个变量都有其有效的作用域,只能在变量的作用域内使用该变量,不能直接使用其他域中的变量
float a = 13.6;
int main(){
int a = 5;
cout<<a<<endl;//输入main函数中的局部变量a
cout<<::a<<endl;//输出全局变量a
return 0;
}
C++提供作用域运算符“::”来指定所需要的的作用域,“::”不可以用来访问函数中的局部变量