C++ 类的构造函数和析构函数

构造函数

注意

class Test {
public:
  Test(int nn, double dd, char cc)
      : d(dd), n(nn), c(cc)
  {
    n = 10;
    d = 3.4;
    c = 'b';
  }

  void show() const {
    cout << n << " " << d << " " << c << endl;
  }

private:
  int n;
  double d;
  char c;
};

Test test(2, 2.1, 'a');
test.show();
// 运行结果:10 3.4 b
// 构造函数可以理解为,定义时先用参数列表对数据成员进行初始化,
// 然后又对数据成员进行赋值,最后的值是赋值的结果
class Test {
public:
  Test(int& nn, const double dd)
      : d(dd), n(nn)
  { }

  void show() const {
    cout << n << " " << d << endl;
  }

private:
  int& n;
  const double d;
};

int n = 5;
Test test(n, 3.5);
test.show();

// 运行结果:5 3.5

拷贝构造

// ====== 浅拷贝示例代码 ======
class Test {
public:
  Test(int nn, double dd)
    : n(nn), d(dd)
  { }

  Test(const Test& t) // 定义拷贝构造函数
    : n(t.n), d(t.d)
  { }

  void show() const {
    cout << n << " " << d << endl;
  }

private:
  int n;
  double d;
};

// 调用:实例化一个对象,并用这个对象去初始化另一个对象时就会调用类的拷贝构造函数
Test t(5, 2.5); // 实例化一个对象
Test test1(t);  // 用对象t初始化另一个对象,调用拷贝构造函数
Test test2 = t; // 通过重载的 "=" 初始化对象,调用拷贝构造函数
Test* test3 = new Test(t);  // 调用拷贝构造函数初始化对象
delete test3;
// ====== 浅拷贝 ======
class Test {
public:
  Test(int n)
    : p(new int(n))
  { }

  Test(const Test& t)
    : p(t.p)
  { }

  ~Test() {
    delete p;
  }

private:
  int* p;
};

Test t(10);
Test test(t);
// 程序运行出错,重复释放内存

// ====== 深拷贝 ======
class Test {
public:
  Test(int n)
    : p(new int(n))
  { }

  Test(const Test& t)
    : p(new int(*t.p))
  { }

  ~Test() {
    delete p;
  }

private:
  int* p;
};

Test t(10);
Test test(t);
// 程序正常运行

临时变量

临时变量的作用域是当前行

// 临时变量的形式 typename(); 类型后面跟上小括号
// 下面这条语句的执行过程是,OS创建一个临时变量假设是 int temp = 12; 然后c = temp;
// 这个temp就是一个临时变量,它的作用域就是所在的这行语句
int c = int(12);

class Test {
}

Test(); // 临时变量,作用域是当前行,在C++标准库中常见

注意

类成员有指针变量时,通过拷贝构造给同类的对象初始化可以考虑使用深拷贝避免空间的重复释放,若没有指针变量使用浅拷贝就可以满足要求

析构函数

Table of Contents