第讲拷贝构造函数精读.pptVIP

  • 5
  • 0
  • 约4.18千字
  • 约 23页
  • 2016-08-20 发布于湖北
  • 举报
Designed by Ruifang ZHAI 华中农业大学计算机科学与技术系 C++ 程 序 设 计 C++ Programming 翟瑞芳 Email: rfzhai@mail.hzau.edu.cn Office: 逸夫楼B407-1 拷贝构造函数 一、拷贝构造函数 4.3.2 P109 二、浅拷贝与深拷贝 6.5 P226 一、拷贝构造函数 一、拷贝构造函数 拷贝构造函数:具有构造函数的所有特性,形参是本类对象的引用。 使一个已经存在的对象,去初始化一个新对象。 创建新对象A时,若用另一个对象B来初始化,需使用复制(拷贝)构造函数将B的值传给A。 Rect rec1, rec2(2,4,6,2); Rect rec3=rec1, rec4(rec2); 有关拷贝构造函数形参的讨论 ①传值型:Rect(Rect r) ②指针型:Rect(const Rect *r) ③引用型:Rect(const Rect r) 用实参(已经存在的对象)初始化形参(新创建的对象),本身需要拷贝构造函数,形成逻辑上的循环定义。 × 用对象的地址作实参,而非对象作实参。 × 用对象作实参初始化引用型形参,但并不新创建对象。用const限制可保护实参不被函数体修改。 √ 拷贝构造函数的形参为本类对象的引用 一、拷贝构造函数 2°若类中未定义拷贝构造函数,系统会自动生成一个默认拷贝构造函数: 类名(类名 x){ *this=x; } 特性: 1°用拷贝构造函数创建对象时,不会调用其他构造函数。 3°每个类有且仅有一个拷贝构造函数,且不能重载。 一、拷贝构造函数 特性: 4°使用拷贝构造函数创建对象常见的三种场合: (1)创建新对象时 (2)调用函数时 (3)函数返回对象时 在函数设计中,使用引用型形参、引用返回类型,可避免拷贝构造对象。 一、拷贝构造函数 Class Point{ public: Point (int xx=0, int yy=0) { //constructor; x = xx; yy = yy;} Point( Point p); //copy constructor; int getX() { return x; } int getY() { return y; } private: int x, y; }; Point::Point(Point p){ x = p.x; y = p.y; coutp.getX()endl; } 一、拷贝构造函数 (1) 创建新对象时,用一个已存在的对象初始化新对象 int main( ) { Point a(1,2); Point b(a); //用对象a初始化对象b Point c = a; //用对象a初始化对象c coutb.getX()endl; return 0; } 一、拷贝构造函数 调用函数时,用一个已存在的对象作实参初始化值传递的形参 void f(Point p) { coutp.getX()endl;} int main() { Point a(1,2); f(a); //调用时拷贝构造函数被调用; return 0; } 一、拷贝构造函数 (3) 函数返回对象时,用返回的表达式(一个已经存在的对象)初始化值返回时创建的临时对象 Point g( ) { Point a(1,2); return a; //返回函数值时,拷贝构造函数调用 } int main() { Point b; b = g(); return 0; } 一、拷贝构造函数 二、浅拷贝和深拷贝 class Rect { public: Rect() // 构造函数,p指向堆中分配的一空间 { p = new int(100); } ~Rect() // 析构函数,释放动态分配的空间 { coutDestructor!endl; if(p != NULL) { delete p; } } private: int width, height; int *p; // 一指针成员 }; int main() { Rect rect1; Rect rect2(rect1); // 拷贝对

文档评论(0)

1亿VIP精品文档

相关文档