构造函数与拷贝构造函数

  1. 构造函数

    构造函数、析构函数与赋值函数是每个类最基本的函数。

    对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如:

    1  A(void); // 缺省的无参数构造函数
    2  A(const A &a); // 缺省的拷贝构造函数
    3  ~A(void); // 缺省的析构函数
    4  A & operate =(const A &a); // 缺省的赋值函数

    默认构造函数与默认析构函数仅负责对象的创建和销毁,不做对象的初始化和资源的清理。

    C++中通过构造函数确保对象的初始化,如果类存在构造函数,编译器会在创建对象的时候自动调用该函数。

    构造函数特征:

    • 与类同名
    • 没有返回值(与析构函数一致)
    • 构造函数可以被重载,由实参决定调用哪个构造函数

       1 class A
       2 {
       3       public:
       4           int i,j;
       5
       6           A(): i(0), j(0) {}; //构造函数一:使用构造函数初始化列表
       7           A(int iI, int iJ); //构造函数二:使用参数赋值
       8 };
       9
      10 A::A(int iI, int iJ) {
      11       i = iI;
      12       j = iJ;
      13 }

      构造函数一使用初始化列表对数据成员进行初始化,这在某些情况下是唯一选择:

      对类中const和引用类型对象的初始化,只能使用初始化列表,不能赋值操作

       1 class A
       2 {
       3     public:
       4         A(int ii);
       5     private:
       6         int i;
       7         const int ci;
       8         int &ri;
       9 };
      10
      11 A::A(int ii)
      12 {
      13     i = ii;   //ok
      14     ci = ii; //const对象不可以赋值
      15     ri = i;  //赋值给ri但对象未绑定
      16 }
      17
      18 //正确写法如下:
      19 A::A(int ii) : i(ii), ci(i), ri(ii){}

      默认构造函数(default constructor)就是在没有显式提供初始化式时调用的构造函数。它由不带参数的构造函数,或者为所有的形参提供默认实参的构造函数定义。如果定义某个类的变量时没有提供初始化式就会使用默认构造函数。 

    • 2.拷贝构造函数

      特征:

      • 只有单个形参,形参为对本类类型对象的引用(用const修饰)

      (1)如果没有定义拷贝构造函数,编译器会合成拷贝构造函数

      函数行为是逐个成员进行初始化,然后将新对象初始化为原对象的副本。数组成员是例外,合成拷贝构造函数会拷贝整个数组。

      (2)自定义拷贝构造函数

      A(const A&);

      大多数类应定义拷贝构造函数和默认构造函数。

      (3)禁止拷贝

      如果一个类需要禁止赋值,并需显式地声明拷贝构造函数为private,这样就不允许用户代码对该类类型的对象进行复制。

      但类的友元和成员仍然可以进行复制,也需要禁止的话,就需要声明一个拷贝构造函数为private且对它不进行定义。

时间: 2024-08-30 08:33:21

构造函数与拷贝构造函数的相关文章

c++ 构造函数,拷贝构造函数,析构函数与赋值操作符

题目: 为下面的Rectangle类实现构造函数,拷贝构造函数,赋值操作符,析构函数. class Shape { int no; }; class Point { int x; int y; }; class Rectangle: public Shape { int width; int height; Point * leftUp; public: Rectangle(int width, int height, int x, int y); Rectangle(const Rectang

C++中构造函数,拷贝构造函数,析构函数

C++中默认构造函数就是没有形参的构造函数.准确的说法,按照<C++ Primer>中定义:只要定义一个对象时没有提供初始化式,就是用默认构造函数.为所有 的形参提供默认实参的构造函数也定义了默认构造函数. 合成的默认构造函数,即编译器自动生成的默认构造函数.<C++ Primer>中的说明:一个类哪怕只定义了一个构造函数,编译器也不会再生成默认构造函数.这条规则的根据是,如果一个类再某种情况下需要控制对象初始化,则该类很可能在所有情况下都需要控制.只有当一个类没有定义构造函数时,

构造函数、拷贝构造函数和析构函数的的调用时刻及调用顺序

构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 对象是由“底层向上”开始构造的,当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止.因为,构造函数一开始构造时,总是要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,如果无专门说明0,就调用直接基类的默认构造函数.在对象析构时,其顺序正好相反.   下面简单介绍下这三个函数. 构造函数       1.构造函数不能有返回值  

【编程题】编写String类的构造函数、拷贝构造函数、析构函数和赋值函数

[编程题]编写String类的构造函数.拷贝构造函数.析构函数和赋值函数 [题目]:请编写如下4个函数 1 class String 2 { 3 public: 4 String(const char *str = NULL);// 普通构造函数 5 String(const String &other); // 拷贝构造函数 6 ~ String(void); // 析构函数 7 String & operate =(const String &other);// 赋值函数 8

C++构造函数和拷贝构造函数详解

构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数). 对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void); // 缺省的无参数构造函数 A(const A &a); // 缺省的拷贝构造函数 ~A(void); // 缺省的析构函数 A & op

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

构造函数:在对象被创建时利用特定的初始值构造对象,即初始化对象. 拷贝构造函数:用一个已经存在的对象去初始化另一个对象,这两个对象的类型应该是一样的. 格式: class 类名 { public: 类名(形参);                 //构造函数 类名(类名 &对象名);    //拷贝构造函数 ... }; 类名::类名(形参)            //构造函数的实现 { 函数体 } 类名::类(类名 &对象名)      //拷贝构造函数的实现 { 函数体 } 构造函数在

C++ 构造函数_拷贝构造函数

拷贝构造函数 系统自动生成的函数: 普通构造函数 拷贝构造函数 如果自己定义了普通构造函数,系统不会再自动生成普通构造函数: 如果自己定义了拷贝构造函数,系统不会再自动生成拷贝构造函数. ***如果没有自定义的拷贝构造函数则系统自动生成一个默认的拷贝构造函数. ***当采用直接初始化或者复制初始化实例对象时,系统自动调用拷贝构造函数. 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象.拷贝构造函数通常用于: 通过使用另一个同类型的对象来初始化新创

CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 class Person{ public : Person():age(10), name(NULL); Person(int myage, char *myname); Person(const Person &a); ~Person(void); void set_age(int myage); void get_age(void); void set_other_age(Person &a, int b); private: i

C++空类编译器自动生成的6个成员函数、关于构造函数、拷贝构造函数的解释

对于空类,编译器不会生成任何的成员函数,只会生成1个字节的占位符. 有时可能会以为编译器会为空类生成默认构造函数等,事实上是不会的,编译器只会在需要的时候生成6个成员函数:默认构造函数.默认拷贝构造函数.默认析构函数.默认赋值运算符 这四个是我们通常大都知道的.但是除了这四个,还有两个,那就是取址运算符和 取址运算符 const. class Empty { public: Empty(); //缺省构造函数 Empty(const Empty &rhs); //拷贝构造函数 ~Empty();

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

对于这样一种类与类之间的关系,我们希望为其编写“深拷贝”.两个类的定义如下: 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. 拷贝构造函数 /