1.inline内联函数
对于不包含循环的简单函数,使用inline关键字声明。编译器将内联函数调用用其代码展开,称为“内联展开”,避免函数调用开销,提高程序执行效率。
inline double f(double a,double b)
{
return sqrt(a*a+b*b);
}
int main()
{
double k=1,q=2;
f(k,m);
//此处不将调用函数,而是直接把sqrt()替换到主函数里面
//即f(k,m)=sqrt(k*k+q*q)
}
2.try-catch处理异常情况
正常代码放在try块里面,catch捕获tcy块中throw抛出的数据
try{
if(a>2) throw 5;
if(a<2) throw 0;
throw hallo;
}
catch(int result){
b=result+1;
}
catch(...){ // throw抛出的异常和上面catch接收的数据类型不匹配时,例如字符hallo
cout<<"其他情况"<<end1;
}
//接收抛出字符
catch(char *a){}
3.函数形参可以带有默认值,但必须一律放在最右边
double f(double a,double b=7){} //ture
double f(double b=7,double a){} //fault
4.函数重载
C++允许函数同名,前提是形参不一样(个数或对象参数类型);
调用函数时将会根据实参来选择最合适的函数,如难以区分选择就会报错
注意:不能根据返回类型区分同名函数
//fault
double f(int a){...}
int f(int a){...}
//ture
double f(int a,double b){...}
double f(int a){...}
5.模板template函数
可以对任何能比较大小的数据类型使用该模板让编译器自动生成一个针对该数据类型的具体函数
我们不需要考虑实参是int还是double来设置形参是int或double,形参的数据类型由编译器自动生成
template <class T>
T minValue(T a,T b)
{
if(a<b)
return a;
else
return b;
}
//若遇到实参是不同的数据类型:
template <class T1,class T2>
T1 minvalue(T1 a,T2 b)
{
if(a<b)return a;
else return (T1)b; //类型强制转换,将T2的b转换成T1才可以返回值
}
6.动态内存分配
关键词 new 和 delete 比C语言的 malloc/alloc/realloc 和 free 更好,可以对类对象调用初始化构造函数或销毁析构函数
注意:new分配的是堆存储空间,即所有程序共同拥有的自由内存
#define _CRT_SECURE_NO_WARNINGS
#include <isotream>
#include <cstring>
using namespace std;
int main(){
double d=3.1;
double *dp;
dp=&d; //指针dp指向d,*dp=d=3.1
dp=new double; //new分配刚好可以容纳double值的内存块
//此时dp的地址是新的地址,而不是d的地址
*dp=45.3; //dp指向的内存块的值改为45.3,*dp=45.3,d=3.1
delete dp; //释放动态分配的内存
dp=new double[5]; //分配能存放5个double值的内存块,dp为内存块的起始地址
//赋值的时候当数组使用
dp[0]=12312,dp[1]=213;
delete[] dp; //delete dp;只释放第一个dp
注意:可以double *q; q=dp+1; //q [0] =dp [1]
7.类:在C的struct类型上增加了“成员函数”
C的struct可将一个概念或实体的所有属性组合在一起,描述同一类对象的共同属性
C++使得struct不但包含数据,还包含函数(方法)用于访问或修改类变量(对象)
struct Date{
int d,m;
void init(int dd,int mm){
d=dd;m=mm;
}
void print(){
cout<<d<<y<<end1; //输出Date里面的d和m
}
}
int main()
{
Date day;
day.print(); //输出0,0
day.init(4,2);
day.print(); //输出4,2