当前位置: 代码迷 >> 综合 >> 类中的构造函数,析构函数,复制构造函数,赋值函数
  详细解决方案

类中的构造函数,析构函数,复制构造函数,赋值函数

热度:98   发布时间:2023-09-30 09:26:43.0

构造函数、析构函数、赋值函数是每个类最基本的的函数。每个类只有一个析构函数和一个赋值函数。但是有很多构造函数(一个为复制构造函数,其他为普通构造函数。对于一个类A,如果不编写上述四个函数,c++编译器将自动为A产生四个默认的函数,即:

  • A(void)                                    //默认无参数构造函数
  • A(const A &a)                         //默认复制构造函数
  • ~A(void);                                //默认的析构函数

  • A & operator = (const A &a); //默认的赋值函数
复制构造函数的使用:
              > 当用一个已经存在的对象去初始化一个新对象时
              > 当形参和实参都是对象,实参与形参进行结合时
              > 当函数的返回值是对象,return语句完成之时
赋值构造函数:对两个已经存在的函数使用
构造函数和复制构造函数的例子:
 ////// @file    Computer1.cc/// @author  miaobeihai(452686191@mail.com)/// @date    2017-04-11 11:42:38///#include <string.h> // C的头文件放在C++头文件的前面#include <iostream>
using std::cout;
using std::endl;class Computer
{
public:Computer(const char * brand, float fPrice)//构造函数: _brand(new char[strlen(brand) + 1]), _fPrice(fPrice){cout << "Computer(const char *, float)" << endl;strcpy(_brand, brand);}void print();//这是系统为我们提供的复制构造函数
#if 0Computer(const Computer & rhs): _brand(rhs._brand) //浅拷贝, _fPrice(rhs._fPrice){cout << "Computer(const Computer &)" << endl;}
#endif//复制构造函数的参数不能是对象,如果是,就会产生无穷递归//使用引用就可以打破无穷递归//const关键字不能去掉, 非const引用不能绑定到右值Computer(const Computer & rhs) //复制构造函数: _brand(new char[strlen(rhs._brand) + 1])//深拷贝, _fPrice(rhs._fPrice){strcpy(_brand, rhs._brand);cout << "Computer(const Computer &)" << endl;}~Computer(){cout << "~Computer()" << endl;delete [] _brand;}private:char  * _brand;float _fPrice;
};void Computer::print()
{cout << "品牌:" << _brand << endl<< "价格:" << _fPrice << endl;
}int main(void)
{Computer com("Mac", 10000);com.print();//com.~Computer();//析构函数可以显式调用,但一般不这样用Computer com2 = com;com2.print();const Computer & com3 = Computer("IBM", 7000);#if 1int a = 10;int & ref = a;const int & ref1 = 10;//10叫右值, 不能进行取地址
#endifreturn 0;
}

运行结果如下:
Computer(const char *, float)
品牌:Mac
价格:10000
Computer(const Computer &)
品牌:Mac
价格:10000
Computer(const char *, float)
~Computer()
~Computer()
~Computer()

构造函数和赋值构造函数:
 ////// @file    Computer1.cc/// @author  miaobeihai(452686191@mail.com)/// @date    2017-04-11 11:42:38///#include <string.h> // C的头文件放在C++头文件的前面#include <iostream>
using std::cout;
using std::endl;class Computer
{
public:Computer(const char * brand, float fPrice): _brand(new char[strlen(brand) + 1]), _fPrice(fPrice){cout << "Computer(const char *, float)" << endl;strcpy(_brand, brand);}void print();//这是系统为我们提供的复制构造函数
#if 0Computer(const Computer & rhs): _brand(rhs._brand) //浅拷贝, _fPrice(rhs._fPrice){cout << "Computer(const Computer &)" << endl;}
#endif//复制构造函数的参数不能是对象,如果是,就会产生无穷递归//使用引用就可以打破无穷递归//const关键字不能去掉, 非const引用不能绑定到右值Computer(const Computer & rhs): _brand(new char[strlen(rhs._brand) + 1])//深拷贝, _fPrice(rhs._fPrice){strcpy(_brand, rhs._brand);cout << "Computer(const Computer &)" << endl;}#if 1Computer & operator=(const Computer & rhs){cout << "Computer & operator=(const Computer&) " << endl;if(this == &rhs)return *this;// 先考虑自复制的问题delete [] _brand;//再回收原来的开辟的空间_brand = new char[strlen(rhs._brand) + 1];//最后进行深拷贝strcpy(_brand, rhs._brand);this->_fPrice = rhs._fPrice;return *this;}
#endif~Computer(){cout << "~Computer()" << endl;delete [] _brand;}private:char  * _brand;float _fPrice;
};void Computer::print()
{cout << "品牌:" << _brand << endl<< "价格:" << _fPrice << endl;
}int main(void)
{Computer com("Mac", 10000);com.print();Computer com2("IBM", 7000);com2.print();cout << "进行赋值之后:" << endl;com2 = com;com2.print();//com = com;return 0;
}

运行结果如下:
Computer(const char *, float)
品牌:Mac
价格:10000
Computer(const char *, float)
品牌:IBM
价格:7000
进行赋值之后:
Computer & operator=(const Computer&) 
品牌:Mac
价格:10000
~Computer()
~Computer()


  相关解决方案