C++语言程序设计:第2讲 类和对象.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 4.3.2 复制构造函数 复制构造函数是一种特殊的构造函数,其形参为本类的对象引用。作用是用一个已存在的对象去初始化同类型的新对象。 class 类名 { public : 类名(形参);//构造函数 类名(const 类名 对象名);//复制构造函数 ... }; 类名::类( const 类名 对象名)//复制构造函数的实现 { 函数体 } * * *默认构造函数 调用时可以不需要参数的构造函数都是默认构造函数。 当不定义构造函数时,编译器自动产生默认构造函数 在类中可以自定义无参数的构造函数,也是默认构造函数 全部参数都有默认形参值的构造函数也是默认构造函数 下面两个都是默认构造函数,如果在类中同时出现,将产生编译错误: Clock(); Clock(int newH=0,int newM=0,int newS=0); * * 4.3.2 复制构造函数 复制构造函数被调用的三种情况 定义一个对象时,以本类另一个对象作为初始值,发生复制构造; 如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造; 如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,此时发生复制构造。 * 例4-2 Point类的完整程序 class Point { //Point 类的定义 public: Point(int xx=0, int yy=0) { x = xx; y = yy; } //构造函数,内联 Point(const Point p); //复制构造函数 void setX(int xx) {x=xx;} void setY(int yy) {y=yy;} int getX() const { return x; } //常函数(第5章) int getY() const { return y; } //常函数(第5章) private: int x, y; //私有数据 }; //成员函数的实现 Point::Point (const Point p) { x = p.x; y = p.y; cout Calling the copy constructor endl; } * //形参为Point类对象的函数 void fun1(Point p) { cout p.getX() endl; } //返回值为Point类对象的函数 Point fun2() { Point a(1, 2); return a; } ? //主程序 int main() { Point a(4, 5); //第一个对象A Point b = a; //情况一,用A初始化B。第一次调用复制构造函数 cout b.getX() endl; fun1(b); //情况二,对象B作为fun1的实参。第二次调用复制构造函数 b = fun2(); //情况三,函数的返回值是类对象,函数返回时调用复制构造函数 cout b.getX() endl; return 0; } 例4-2 (续) * *函数参数尽量传递常引用而不是值 传递对象值会引起复制构造和析构,增加时间空间开销。 传常引用可避免这一问题。以引用做参数时,尽量使用常引用。(第5章) 例如: void fun1(const Point p) { cout p.getX() endl; p.setX(1); //语法错误:p是常引用而setX不是常函数 } 基本类型、STL的迭代器和函数对象传值较好。(第12章) * *返回值优化 当函数返回一个对象时,会构造临时对象用以返回,这会增加开销。 用返回引用或者指针替代不是好办法。返回指向局部对象的指针或者引用,会引发错误。返回指向动态内存的指针或引用容易忘记动态空间释放,引起内存泄露。 解决显式构造临时对象返回。此举表面上还是构造了一个临时对象,但是编译器通常都会进行优化,使之不产生临时对象。 例如: Point fun2() { return Point(1, 2); } * 隐含的复制构造函数 如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个隐含的复制构造函数。 这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。 * 4.3.3 析构函数 完成对象被删除前的一些清理工作。 在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。 如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数。 * 构造函数和析构函数举例

文档评论(0)

学习让人进步 + 关注
实名认证
文档贡献者

活到老,学到老!知识无价!

1亿VIP精品文档

相关文档