1、在函数重载中,主要通过参数类型的不同来重载,而不能通过返回值不同来重载。在函数的参数缺省值的设置中要注意不要和函数重载弄混,比如: void output( int x); void output( int x, float y=0.0); 这样就有二义行,如果有函数调用output(a)(a在这里为一整形数)时,不知道该调用哪个,产生错误!
2、在函数返回值为地址或引用时应该注意返回值不能是局部变量,应该是全局变量、静态变量等,静态变量(只在定义的局部函数里面可见)和全局变量共享全局数据区,在整个函数运行期间都存在,虽然用局部变量暂时可以得到正确的答案,如: #include <iostream.h>
int *f(int x,int y) { int *z; int temp=x+y; z=&temp; return z; }
int f1() { cout<<"what wrong?"<<endl; return 0; }
int main() { int a,b; int *c; cin>>a>>b; c=f(a,b); cout<<*c<<endl; f1(); cout<<*c; return 0; } 这个函数如果输入2,3则输出是: 5 what wrong? -858993460 调用函数f1后再输出的c所指向的值是一个不确定的值,因为这个时候函数f已经结束,它用来返回的临时变量也在程序做了一些别的事情后被覆盖掉或释放。
3、参数传递传递指针和引用主要是为了效率,当一个数据类型很大时,因为传值要复制副本,所以不可取,但是另一方面由于指针和引用传递时参数容易被修改,所以我们在参数传递的时候加上关键字const用来限制调用函数对参数的改变。比如函数声明可以这样写:int fn(const int & a);则在这个函数里面,虽然a和实际参数指向的是同一地址单元,但是因为是const的,所以其值不可改变。
4、const int *ip;指向常量的指针,其指针值可以变,但是它所指内存中的值不可以改变(内存中的内容为常量); int *const ip=&i;指针常量,其指针值不可以改变,但是它所指向内存中的值可以改变,并且在定义的时候需要赋初值; const int *const ip=&i;指向常量的常量指针,定义时也需要初始化。
5、如果运算符被重载为全局函数,那么只有一个参数的运算符叫做一元运算符,有两个参数的运算符叫做二元运算符。如果运算符被重载为类的成员函数,那么一元运算符没有参数,二元运算符只有一个右侧参数,因为对象自己成了左侧参数。其中运算符的重载规则如下:
运算符 规则 所有的一元运算符 建议重载为成员函数 = () [] -> 只能重载为成员函数 += -= /= *= &= |= ~= %= >>= <<= 建议重载为成员函数 所有其它运算符 建议重载为全局函数
6、this指针指向调用函数的那个对象。此条很容易解释第5条为什么运算符重载为类的成员函数时一元运算符没有参数,二元运算符只有一个右侧参数。
|