C++ Primer Plus 笔记06
格式化设置
1.方法setf()能设置各种格式化状态。
调用setf(ios_base::fixed)
将对象至于使用定点表示法的模式;
调用setf(ios_base::showpoint)
将对象至于显示小数点的模式,即使小数部分为零。
2.方法precision()能指定显示多少位小数(假定对象处于定点模式下)。
以上的设置都将一直保持不变,直到再次调用相应的方法重新设定他们。
3.方法width()设置下一次输入操作使用的字段宽度,这种设置只在显示下一个值时有效,然后恢复默认状态。
例:
ios_base::fmtflags initial;
inital = os.setf(ios_base::fixed); //os为一个ostream类的对象
...
os.setf(initial);
在os对象下调用setf()方法,返回调用它之前有效的所有格式化设置。
ios_base::fmtflags是存储这种信息所需的数据类型名称。因此将返回值赋给initial就是赋值给initial调用之前的所有格式化设置。
然后initial作为参量来调用setf(),将所有格式化设置恢复到原来的值。
何时使用引用参量
1.能修改调用函数中的数据对象
2.数据类型比较大时,如类和结构,提升效率。
什么时候用引用,什么时候用指针,什么时候用按值传递
1.数据对象很小时,按值传递
2.数据对象是数组时,只能使用指针。(不想修改数据则为const *)
3.数据对象较大时,使用指针或引用。(不想修改数据则为const *)
4.数据对象是类时,使用引用。(不想修改数据则为const *)
默认参数
指的是当函数调用中省略了实参时自动使用的一个值。
例,将void wow (int n)
设置成n有默认值为1,则调用wow()相当于调用wow(1).
通过函数原型设置:
char * left(const char * str,int n = 1);
而函数实现保持正常设置:
char * left(const char * str,int n = 1)
{
...
}
如果有值则会覆盖默认值,如果没有则为1.
注意事项:
在参数列表里面,只能从左向右添加默认值,也就是说,如果要设置默认值,不管有几个,都要全部放在右边。如:
int harpo(int n, int m = 4, int j = 5); //可行
int chico(int n, int m = 6, int j); //不可行
函数重载
默认参数能让你是哟个不同数目的参数第哦啊用同一个函数,而函数重载能让你使用多个同名的函数。
重载的关键是函数的参数列表–特征标。如果两个函数的参数数目和类型相同,同时参数排列顺序也相同,则特征标相同。返回类型不算特征标,可以相同,也可以不同。
若特征标不同则可如下定义函数:
void print(const char * str, int width); //#1
void print(double d, int width); //#2
void print(long l, int width); //#3
void print(int i, int width); //#4
void print(const char * str); //#5
使用时编译器会根据用法使用有相应特征标的原型:
print("hello",15); //use #1
print("hello"); //use #5
print(1999.0,15); //use #2
print(1999,15); //use #4
print(1999L,15); //use #3
若出现:
unsigned int year = 3210;
print(year, 6);
此时print()函数不与任何一个原型匹配,但他会去找函数强制类型转换,如找#2。如果只有#2函数被定义了,会将year转换为double类型。但上面有3个数字作为第一个参数的原型,编译器就会报错。
注意以下的两个原型:
double cube(double x);
double cube(double & x);
虽然看起来特征标不相同,但是不能共存的,如cout<< cube(x);
参数x与两个原型都匹配。
所以类型引用与类型本身视为同一特征标。
还需注意的一点,在匹配函数时并不区分const和非const变量。
const为形参的函数可以和const或非const实参匹配
非const为形参的函数只可以和非const实参匹配
何时使用函数重载
仅当函数执行相同的任务,但使用不同形式的数据时,才应采用函数重载。
什么是名称修饰
他根据函数原型中指定的形参类型对每个函数名进行加密,将名称转换为接口代码,方便计算机识别调用。