构造函数、拷贝构造函数、赋值操作符

  对于这样一种类与类之间的关系,我们希望为其编写“深拷贝”。两个类的定义如下:

class Point {
    int x;
    int y;
};

class Polygon : public Shape {
    Point *points;
};

  1. 构造函数

//构造函数
Polygon(const Point &p) : _point(new Point)
{
  this->_point->x = p.x;
  this->_point->y = p.y;
}

  2. 拷贝构造函数

//拷贝构造
Polygon(const Polygon &p) : _point(new Point)
{
    this->_point->x = p._point->x;
    this->_point->y = p._point->y;
}

  3. 赋值构造函数

//赋值操作符
void operator= (const Polygon &rhs)
{
    this->_point->x = rhs._point->x;
    this->_point->y = rhs._point->y;
}

  全部代码 & 测试用例

#include <iostream>

using namespace std;

struct Shape {
    int no; //形状编号
};

struct Point {
    int x;
    int y;

    Point(int x, int y) : x(x), y(y) {}
    Point() = default;
};

struct Polygon :public Shape {
    Point *_point;

    //构造函数
    Polygon(const Point &p) : _point(new Point)
    {
        this->_point->x = p.x;
        this->_point->y = p.y;
    }

    //拷贝构造
    Polygon(const Polygon &p) : _point(new Point)
    {
        this->_point->x = p._point->x;
        this->_point->y = p._point->y;
    }

    //赋值操作符
    void operator= (const Polygon &rhs)
    {
        this->_point->x = rhs._point->x;
        this->_point->y = rhs._point->y;
    }

    ~Polygon()
    {
        delete this->_point;
    }
};

int main()
{
    Point x1(1, 2);

    Polygon p1(x1);
    Polygon p2 = p1;
    Polygon p3(p2);

    p1 = p2;

    return 0;
}

  内存中变量地址

  p1 . _ponit 内存地址 0x002c0cb8

  p2 . _point 内存地址 0x002c0cf0

  p3 . _point 内存地址 0x002c0d28

  (都是不相同的内存地址)

成功

时间: 2024-11-17 23:41:59

构造函数、拷贝构造函数、赋值操作符的相关文章

C++ 拷贝构造函数和重载赋值操作符相互调用分析 [转]

结论: 从面相对象编程的角度考虑,拷贝构造函数调用重载赋值操作符,重载赋值操作符调用拷贝构造函数的写法都是没有意义的.应该避免. Don't try to implement one of the copying functions in terms of the other. Instead, put common functionality in a third function that both call. ——Effective C++ Third Edition By Scott M

C++11六大函数(构造函数,移动构造函数,移动赋值操作符,复制构造函数,赋值操作符,析构函数)

在C++中,有三大函数复制控制(复制构造函数,赋值操作符,析构函数),而在C++11中,加入了移动构造函数,移动赋值操作符.我就斗胆将他们命名为六大函数好了. 一.构造函数 c++primer中说过:构造函数是特殊的成员函数,只要创建类类型的新对象,都要执行构造函数.构造函数的工作就是保证每个对象的数据成员具有合适的初始值. 构造函数与其他函数不同:构造函数和类同名,没有返回类型. 构造函数与其他函数相同:构造函数也有形参表(可为void)和函数体.  (参数表为void的构造函数为默认构造函数

C++构造函数 &amp; 拷贝构造函数 &amp; 派生类的构造函数 &amp; 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程:

【c++ primer, 5e】构造函数 &amp; 拷贝、赋值和析构

[构造函数] 1.构造器就是创建对象时被调用的代码. 2.如果没有自定义构造器,那么编译器将自动合成一个默认的无参构造器. 3.自定义的构造器不允许加const,所创建const的对象只有在构造器代码执行完后,才被赋予const性质. 4.如果自定义了构造器,那么默认的构造器将无效化,可以理解为自定义内容覆盖了默认的内容. 5.构造函数使用类内初始值并不是一个坏选择. 6.default. 7.构造函数初始值列表. [拷贝.赋值和析构] 如果我们不主动定义这些操作,那么编译器将会替我们合成它们.

构造函数 、析构函数 、拷贝构造函数 ~~~~~~~~~~拷贝构造函数

拷贝构造函数 1.拷贝构造函数作用: ①:程序中需要新建立一个对象,并用另一个同类的对象对它初始化: ②:当函数的参数为类的对象时,需要建立一个实参的拷贝: ③:函数的返回值是类的对象: 2 格式: 注意:关键字const是为了保护参数值,防止被改变 ///在类外定义,加域符 :: Box::Box(const Box &b) { hei=b.hei; len=b.len; wid=b.wid; } 3. 使用情况即考虑到其作用时 ① 建立一个新的对象 #include<iostream&g

拷贝构造函数和赋值操作符

假设有一个如下的MyClass类: class MyClass { public: //构造函数 //拷贝构造函数 MyClass(const MyClass& that) : int_data_(that.int_data_), dbl_data_(that.dbl_data_), str_data_(that.str_data_) { } //赋值操作符 MyClass& operator = (const MyClass& that) { if(this != that) {

赋值构造函数(重载赋值操作符)(c++常问问题二)

*什么是赋值构造函数(重载赋值操作符) 下面的代码演示了什么是赋值构造函数,如果不人为定义赋值构造函数,系统将默认给你分配一个浅拷贝的赋值构造函数(下面例子为深拷贝的赋值操作) class cat { public: //构造函数 cat():m_pMyName(NULL),m_unAge(0) { cout<<"cat defult ctor"<<endl; } //子类赋值构造函数(重载赋值操作符) cat& operator=(cat& o

拷贝构造函数和赋值函数

在 C++ 中,赋值和拷贝是不同的, 1)拷贝构造函数是对未初始化的内存进行初始化操作 2)而赋值是对现有的已经初始化的对象进行操作.(这里我对"已经初始化"的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可),赋值函数应该给所有数据成员都初始化. 3)重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 4)可以说,C++中什么时候有临时对象产生,此时刻c++一定要调用拷贝构造函数.(临时对象产生时有一个特例,此时不需要调用拷

拷贝构造函数与赋值函数的区别

1.从概念上区分:复制构造函数是构造函数,而赋值操作符属于操作符重载范畴,它通常是类的成员函数 2.从原型上来区分:复制构造函数原型ClassType(const ClassType &);无返回值赋值操作符原型ClassType& operator=(const ClassType &);返回值为ClassType的引用,便于连续赋值操作 3.从使用的场合来区分:复制构造函数用于产生对象,它用于以下几个地方:函数参数为类的值类型时.函数返回值为类类型时以及初始化语句,例如(示例了

C++的拷贝构造函数

1?  类会提供默认的拷贝构造函数 –默认的拷贝构造函数会完成所有成员的逐个复制 2?  拷贝构造的调用时机: –函数值传递时 –函数返回时 –用同类型的对象初始时 3?  何时需要自定义拷贝构造函数? –类中有指针(或引用 )成员时 –希望自定义对象的拷贝过程时 4?  使用匿名对象简化编程 // // main.cpp // 拷贝构造函数 // // Created by 06 on 15/1/26. // Copyright (c) 2015年 黄永锐. All rights reserv