首页 > 代码库 > C++对C的加强 总结(4)

C++对C的加强 总结(4)

函数重载

用同一个函数名定义不同的函数

当函数名和不同的参数搭配时函数的含义不同

函数重载至少满足下面的一个条件:

参数个数不同

参数类型不同

参数顺序不同

*/

//当函数默认参数遇上函数重载会发生什么

/*

int func(int a, int b, int c = 0)

{

return a * b * c;

}

 

int func(int a, int b)

{

return a + b;

}

 

int main()

{

int c = 0;

 

c = func(1, 2); // 存在二义性,调用失败,编译不能通过 

 

printf("c = %d\n", c);

 

printf("Press enter to continue ...");

getchar();

return 0;

}

*/

 

/*

编译器调用重载函数的准则

将所有同名函数作为候选者

尝试寻找可行的候选函数

精确匹配实参

通过默认参数能够匹配实参

通过默认类型转换匹配实参

匹配失败

最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。

无法匹配所有候选者,函数未定义,编译失败。

*/

 

/*

函数重载的注意事项

重载函数在本质上是相互独立的不同函数(静态链编)

重载函数的函数类型是不同的

函数返回值不能作为函数重载的依据

函数重载是由函数名和参数列表决定的。

*/

 

//重载和函数指针结合

 

/*

函数重载与函数指针

当使用重载函数名对函数指针进行赋值时

根据重载规则挑选与函数指针参数列表一致的候选者

严格匹配候选者的函数类型与函数指针的函数类型

*/

/*

int func(int x) // int(int a)

{

return x;

}

 

int func(int a, int b)

{

return a + b;

}

 

int func(const char* s)

{

return strlen(s);

}

 

typedef int(*PFUNC)(int a); // int(int a)

 

int main(int argc, char *argv[])

{

int c = 0;

PFUNC p = func;

 

c = p(1);

 

printf("c = %d\n", c);

 

printf("Press enter to continue ...");

getchar();

return 0;

}

*/

函数重载与函数指针

当使用重载函数名对函数指针进行赋值时

根据重载规则挑选与函数指针参数列表一致的候选者

严格匹配候选者的函数类型与函数指针的函数类型

 

 
面向过程编程到面向对象编程训练

#include "iostream"

using namespace std;

 

//目标:抽象立方体 求立方体的和 v

class  Cube

{

public:

void setA(int a)

{

m_a = a;

}

int getA()

{

return m_a;

}

void setB(int a)

{

m_a = a;

}

int getB()

{

return m_b;

}

void setC(int a)

{

m_a = a;

}

int getC()

{

return m_c;

}

void setABC(int a=0, int b=0, int c=0)

{

m_a = a;

m_b = b;

m_c = c;

}

public:

int getS()

{

m_s = 2*(m_a*m_b + m_a*m_c + m_b*m_c);

return m_s;

}

 

int getV()

{

m_v = m_a*m_b*m_c;

return m_v;

}

public:

 

char * cubeEqueal(Cube &c1, Cube &c2)

{

if (c1.getA()== c2.getA() &&

c1.getB()== c2.getB() &&

c1.getC()== c2.getC())

{

return "相等";

}

 

return "不相等";

}

 

char * cubeEqueal(Cube &c2)

{

if (m_a== c2.getA() &&

m_b== c2.getB() &&

m_c== c2.getC())

{

return "相等";

}

 

return "不相等";

}

private:

int m_a;

int m_b;

int m_c;

int m_v;

int m_s;

};

 

void main34()

{

Cube cube1, cube2, cube3;

cube1.setABC(1, 2, 3);

cube2.setABC(2, 3, 4);

cube3.setABC(1, 2, 3);

 

//cout<<cube1.cubeEqueal(cube1, cube2);

cout<<cube1.cubeEqueal(cube2);

cout<<cube1.cubeEqueal(cube1);

//cout<<cubeEqueal(cube1, cube2)<<endl;

//cout<<cubeEqueal(cube1, cube3)<<endl;

system("pause");

}

 

void main31()

{

Cube cube1;

cube1.setABC(1, 2, 3);

cube1.getV();

cube1.getS();

cout<<"体积为:"<<cube1.getV()<<"面积为"<<cube1.getS();

 

system("pause");

}

 

//全局函数

char * cubeEqueal(Cube &c1, Cube &c2)

{

if (c1.getA()== c2.getA() &&

c1.getB()== c2.getB() &&

c1.getC()== c2.getC())

{

return "相等";

}

 

return "不相等";

}

 

void main33()

{

Cube cube1, cube2, cube3;

cube1.setABC(1, 2, 3);

cube2.setABC(2, 3, 4);

cube3.setABC(1, 2, 3);

 

cout<<cubeEqueal(cube1, cube2)<<endl;

cout<<cubeEqueal(cube1, cube3)<<endl;

system("pause");

}