《C++面向对象程序设计》_第2章 从C到C++.ppt

《C++面向对象程序设计》_第2章 从C到C++.ppt

  1. 1、本文档共162页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
《C面向对象程序设计》_第2章从C到C

结构体若满足类多态要求3个条件(1、基类声明有虚函数;2、有继承派生关系;3、基类指针或引用指向派生类对象),结构体也能表现出多态。 例2.58 #include iostream using namespace std; struct Base { int x; virtual void setX(int i) { x = i; } void printX() { coutx = xendl; } }; struct Derived : Base { void setX(int i) { x = 2*i; } }; int main() { Derived d; Base *pb; pb = d; pb-setX(10); // Derived:: setX(int i) pb-printX(); return 0; } 程序执行结果为: x = 20 其中,基结构体Base中声明了setX为虚函数,pb为基结构体指针,指向了一个派生结构体对象d,这时通过pb调用setX将调用Derived的setX。 引用类型作为函数返回值时,应尽量避免返回值是一个局部变量。 例2.45 int add(int a,int b) { int c; c = a+b; return c; //warning C4172: 返回局部变量或临时变量的地址 } int main() { int x = add(1,2); printf(c goes out of existence\n); printf(%d\n,x); return 0; } 程序执行结果为: c goes out of existence -815052929 2.2.8 函数指针和指针函数 一、函数指针 函数指针是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,正如用指针变量可指向整型变量、字符型、数组一样,函数指针只不过是指向函数的指针。程序在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参数。 函数指针定义: 函数类型 (*指针变量名)(形参列表); “函数类型”为函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。 例如: int (*pf)(int x); 若写成: int *pf(int x); 因为按照结合性和优先级来看就是pf先和()结合,它就变成了一个返回整形指针的函数了,而不是函数指针。 例2.46 int func(int x){ return 0; }; // 定义一个函数 int main() { int (*pf) (int x); // 声明一个函数指针 pf = func; // 将func函数的首地址赋给函数指针pf pf = func; // 与pf = func写法没有区别 printf(%x\n,func); printf(%x\n,func); return 0; } 程序执行结果为: 11611ef 11611ef 函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误。 int main() { int func1(int x); double func2(double x); int func3(int x, int y); int (*pf) (int x); pf = func1; // OK pf = func2; // error C2440: “=”: 无法从“double (__cdecl *)(double)”转换为“int (__cdecl *)(int)” pf = func3; // error C2440: “=”: 无法从“int (__cdecl *)(int,int)”转换为“int (__cdecl *)(int)” return 0; } 函数指针除了用于调用函数外,还有一个用途是做函数的参数,既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。其基本用法为: void caller(void(*ptr)()) { ptr(); // 调用ptr指向的函数 } void func(){}; int main() { v

文档评论(0)

ranfand + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档