1、带默认参数的构造函数. (实际中避免用)
会有歧义!
class A{
public:
A(int i=10, int j=11, int k=12);
A(int ,int);
int i,j,k;
};
A::A(int a, int b,int c){
i = a;
j = b;
k = c;
}
A::A(int i,int j){
this->i = i;
this->j = j;
this->k = 100;
}
int main(){
A a;
A a2(20);
A a3(30,40);//错误 ambiguous call to overloaded function
return 0;
}
2、指向对象成员函数的指针
重温下普通函数的指针变量:
int ( * p ) ( int , int );
定义分为三部分:函数类型 ( * 函数指针变量) (参数类型1,参数类型2,……)
void fun(){
cout << "这是fun()" << endl;
}
int main(){
void (* p) (); //p是指向void型函数的指针变量
p = fun; //将fun函数的入口地址赋给指针变量p,p就是指向了函数fun
(*p)(); //调用fun函数。
return 0;
}
而定义一个指向 对象成员函数 的指针变量比较复杂一些。
直接这样写有错误!
class Test{
private:
int num;
public:
void getNum(){
cout << num << endl;
}
void setNum(int num){
this->num = num;
}
};
int main(){
Test t;
t.setNum(10);
void (* p) (); //p是指向void型函数的指针变量
p = t.getNum; //错误! error C2440: '=' : cannot convert from 'void (__thiscall Test::*)(void)' to 'void (__cdecl *)(void)'
return 0;
}
原因:
成员函数与普通函数有一个最根本的区别:它是类中的一个成员。编译系统要求在上面的复制语句中,指针变量的类型必须与赋值号右侧函数的类型相匹配。
在以下三个方面都要匹配:
1) 函数参数的类型 和 参数个数。
2) 函数返回值的类型
3) 所属的类。
第3)点不匹配!应该采用以下的方式:
这种写法确实很蛋疼! 知道为什么java那么火了,从java转C++的伤不起啊
int main(){
Test t;
t.setNum(10);
//void (* p) (); //p是指向void型函数的指针变量
void (Test:: * p) ();
p = &Test::getNum; // 定义指向Test类公有成员函数
(t.*p)(); // 调用p指向 Test类公有成员函数 getNum();
return 0;
}