|
Posted on
2010-08-18 00:14
KurtWang
阅读( 450)
评论()
编辑
收藏
举报
- 参数传递:
- 如果形参是非引用,则复制实参,如果只是引用,则只是实参的别名
- const形参:具有const或非const形参的函数无区别,e.g. void fcn(const int i) 和 void fcn(int i)是重复定义
- 复制实参的局限性:1.需要修改实参 2. 大型对象 3. 无法实现对象复制。可定义为引用和指针类型
- 建议使用const引用形参
- 如果使用引用形参唯一目的是避免复制,则应该定义为const引用
- 使用非const引用形参坏处
- 非const引用形参只能与完全同类型的非const对象关联。
- 使用非const引用形参,不能用const对象初始化
- 不能用字面值或产生右值的表达式实参
- vector应该使用iterator传递
- 数组形参
- 编译器会忽略数组形参的长度 e.g. void printValue(const int ia[10]); int i=0; j[2]={0,1}; printValue(&i); printValue(j); 正确
- 数组实参:非引用形参会被转换为指针;引用形参会严格匹配数组大小 e.g. void printValue( int (&arr)[10] )
- 显式传递数组大小的形参
- int main(int argc, char ** argv);
- return 返回值
- 返回非引用:创建临时对象
- 返回引用:不要返回局部变量的引用,不要返回指向局部对象的指针(局部对象会被释放)
- 默认实参
- screeninit(, , ‘?’) 错误
- 最少使用默认实参的形参排在最前,最可能使用默认实参的形参排在最后
- 在一个文件中,只能为一个形参指定默认实参一次
- 局部对象
- 自动对象:局部变量和形参
- 静态局部对象:不迟于在第一次经过该对象定义语句时初始化,程序结束前不会撤销
- 内联函数:内联函数应放在头文件中,在头文件加入或修改内联函数时,所有源文件必须重新编译
- 编译器隐式的将类内定义的函数当做内联函数
- const成员函数:函数声明 const, const成员函数不能修改调用该函数的对象
- const对象,指向const对象的指针或引用只能调用其const成员函数
- 构造函数
- 如果将构造函数定义为private,则不能定义该对象
- 如果没有定义任何构造函数,则编译器会自动生成默认构造函数
- 默认构造函数将依据变量初始化的规则初始化类中所有成员:
- 对于类类型:调用默认构造函数;
- 对于内置类型:如果对象在全局作用域中定义或定义为静态局部对象,则这些成员被初始化为0,否则没有初始化。
- 重载函数
- 重复声明:const对于非引用形参来说是无关的,lookup(Phone) 和 lookup(const Phone)是重复声明
- 函数内局部声明函数将屏蔽其他声明
- 重载确定的三个步骤
- 候选函数:选择可行函数(实参个数相同,每个实参类型匹配或者可以隐式转换)
- 寻找最佳匹配
- 多个可行函数的重载确定,如果有且仅有一个函数满足下列条件,则匹配成功
- 每个实参匹配都不比其他可行函数差
- 至少有一个比其他可行函数强
- 实参类型转换:等级降序如下
- 精确匹配
- 类型提升(整形提升)
- 标准转换
- 类类型转换
- e.g. 类型提升优先于标准转换
void ff(int);
void ff(short);
ff('a'); //char promotes to int, matches ff(int)
- 重载和const形参:仅当形参是引用或指针时,形参是否为const才有影响
- 传递非const对象,即可用于初始化const引用,也可用于初始化非csont引用,但后者需转换来实现,而前者则是精确匹配。由此可以来确定可行函数的选择
- 指针和引用一样
- 不能用指针本身是否是const来实现函数的重载
- 指向函数的指针
- e.g. bool (*pf)(const string&, const string&);
int max(int x,int y){ return(x>y?x:y); }
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
|