`
从此醉
  • 浏览: 1034957 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

C++面向对象基础,以及一些常见面试 改错题。

 
阅读更多

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; 
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics