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

来源:互联网 发布:linux装php环境 编辑:程序博客网 时间:2024/05/18 04:55

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


原创粉丝点击