上一篇博客简单了解了C++的基本构成和常用符号,接下来了解C++的小特色。
目录:
1.名字空间。
2.字符串处理——string类型。
3.域解析符::。
4.形式参数可带有默认值。
5.函数重载。
6.动态内存空间管理。
1.名字空间
名字空间——namespace,是不是很熟悉,没错,using namespace std就是使用了C++自带的名字空间std。
除了库自带的名字空间,用户也可以自行定义和使用命名空间。
a、名字空间的定义:
namespace 名称{... ; }注意大括号后不用加分号。
E.g:
namespace one
{
int M=200;
int inf=10;
}
如上就成功定义了名字空间one。
b、名字空间的使用:
方法一:名字空间名称::局部内存名
方法二:using namespace 名字空间名称;
方法三:using 名字空间名称::局部内存名;
方法一是将某个名字空间内的局部内存名当作变量或常量使用,在此不多做解释,等下一起给出例子。
方法二直接使用某个名字空间内的所有量,使用后可在其他函数中直接此名字空间内的所有值。
方法三是单独使用一个名字空间内的某一个量。
E.g:
2.字符串类型string
首先,使用string类型必须包括头文件string,并且如果要输入带空格的串需要用getline(cin,s1)。
有了string类型后,不再需要关心内存如何分配,无需处理'\0'结束字符,这些操作将由系统处理。
下面列出一些常用的指令:
求字符串长度:length()
E.g:
串联结:+
E.g:
插入:insert(n,"字符") 其中n表明将要插入在第n位后。
E.g:
替代:replace(n,x,"字符") n表示第n位后,x表示替代几位,注意x可以和替代字符数不同。
E.g:
赋值:substr(n,x)n表示第n位后一位开始,x表示几个字符。
E.g:
删除:erase(n,x)n表示第n位后一位开始,x表示删除几个字符。
E.g:
比较字符串大小:关系运算符
3.域解析符::
域解析符就是两个冒号,作用是在局部变量和全局变量同时存在时调用全局变量,解决了重名问题。
E.g:
4.形参可带有默认值
其特点有:
a、实参给定顺序为从左至右,但是形参默认值给定顺序为从右至左。
b、给定默认值后,若调用时得到了实参,则以实参值优先。即没有给定实参时才使用默认值。
E.g:
注意:若默认值在原型中已经给出,则下面的函数定义不能再提供默认值。
E.g:
5.函数重载
在C语言中,同一作用域中函数名必须是唯一得,这就要求相似功能的函数必须拥有不同的函数名,而函数重载可以解决这个问题。
重载:对于功能完全相同或相似,只是在形参的个数、类型、顺序方面有区别的不同函数,可以用相同的函数来命名。
实际调用时,编译器通过匹配实参和形参来确定具体调用的函数。
E.g:
如上,对同一个函数进行重载,函数名相同,类型不同,编译器根据参数自动选择匹配函数。
关于函数重载,有以下几点需要注意:
1、重载函数必须拥有相同的函数名,但在形参个数、类型、顺序上至少有一个区别。
2、返回值不是区分重载函数的要素。
3、重载函数与带有默认值的函数一起使用时,可能造成二义性,使用时要注意参数个数。
E.g:int square(int x,int y=100)与int square(int x)
4、函数调用时,若给出的实参与形参不相符,将进行自动类型转换。
6.动态内存空间管理
申请动态内存空间——new:
申请1个int型动态内存空间: s1=new int;
申请N个元素的动态一维数组: s1=new int[N];
申请N行M列的动态二维数组: q=new int*[N];
for(i=0;i<N;i++) {q[i]=new int[M];}
释放动态内存空间——delete:
释放1个int型动态内存空间: delete s1;
释放N个元素的动态一维数组: delete []s1;
释放N行M列的动态二维数组: for(i=0;i<N;i++) {delete [] q[i];}
delete []q;
7.强制转换
方法一:(目标类型)待转换类型的表达式;
方法二:目标类型名(待转换类型表达式);
8.异常处理
首先,我们要知道异常是什么。
换个说法——错误。我们写程序时碰到错误是必然的,那么我们了解错误码?
错误分为语法错误和运行错误。
语法错误很常见,根据编译链接时的提示可纠正。
运行错误时编译链接后,程序运行时发生的错误,包括不可预料的逻辑错误和可以预料的运行异常。
逻辑错误时由设计不当引起的,而运行异常时由系统运行环境造成的,如数组下标越界、内存空间不足、0作为除数等
这些异常可以通过增加预防代码来避免。
异常处理函数:
检查异常(try); 其格式为: try{ 被检查的语句};
抛出异常(throw); 其格式为: throw 表达式;
捕捉异常(catch); 其格式为: catch(变量或者异常处理数据的类型) { 处理语句};
E.g:
可以看到,在检查到异常后,发生异常后的语句不再执行,程序直接跳转到捕捉异常中运行。
注意:
1、try语句和catch语句之间不能由任何语句。
2、只能有一个try语句,可以有多个catch语句,表示与不同的异常信息所匹配。
3、若未检查到异常,则跳过catch语句。