C++总结笔记(三)构造函数

常见函数

构造函数

  1. 构造函数和类同名,无返回值。
  2. 构造函数完成成员的初始化工作。
  3. 对象创建时,编译系统对对象分配内存空间,并自动调用该构造函数。
  4. 构造函数的种类以及特点:

4.1   无参构造函数(默认构造参数)

4.1.1          如果创建的一个类,没有写任何构造函数,则系统会自动生成一个不带参数的默认构造函数,函数为空,什么都不做。

4.1.2          如果写了一个不带参数的构造函数,则系统不会再自动生成这样一个默认构造函数。

4.2   一般构造函数(重载构造函数)

4.2.1          一个类可以有多个一般构造函数,但是参数类型或者参数个数必须不同;

4.3   拷贝构造函数

4.3.1          拷贝构造函数的参数为类对象本身,用于根据一个已存在的对象复制出一个新的该类的对象。

4.3.2          如果没有显示的写一个拷贝构造函数,系统会自动创建一个拷贝构造函数,

4.3.3          深拷贝:自定义拷贝构造函数,可以防止编译器自动生成一个默认拷贝构造函数,当这个类对象发生复制过程时,会重新分配资源;

4.3.4          浅拷贝:编译器自动生成的默认拷贝构造函数,该构造函数完成对象之间的位拷贝,又叫浅拷贝。浅拷贝没有重新分配资源,把对象的值完成复制给另外一个对象,这时同时指向了一块内存,如果前者对象中的一个指针成员变量delete释放掉了,那后者对象中的指针变量就变成了一个野指针,所以避免浅拷贝。

4.4    等号运算符重载

4.1.1   如果不自定重载等号,等号只能完成简单的拷贝工作。

4.1.2   不属于构造函数;将等号右边的对象赋值给等号左边的对象,等号左右两边的对象必须都已经存在。

#include<iostream>
#include<string>
using namespace std;

class People
{
 public:
  //定义了一个无参的构造函数,此时系统不会在自己创建一个默认构造函数;
  People()
  {
   name = "HCJ";
  }

  //一般构造函数
  People(string name)
  {
   this->name = name;
   cout<<"My name is "<<this->name<<endl;
  }

  People(string name,string sex)
  {
   this->name = name;
   this->sex = sex;
   cout<<"My name is "<<this->name<<"! I am "<<this->sex<<endl;
  }
  
  //拷贝构造函数
  People(const People &c)
  {
   name = c.name;
   sex = c.sex;
  }
  
  //重载等号
  People &operator=(const People &r)
  {
   //如果等号左边的就是等号右边的对象本身,就返回对象本身
   if(this == &r)
   {
    return *this;
   }
   
   this->name = name;
   this->sex = sex;

   return *this;
  }

  string name;
  string sex;
};

int main()
{
 //默认构造函数
 People p;
 cout<<p.name<<endl;
   
 //一般构造函数
 string name = "huochangjun";
 string sex = "F";
 People pp(name);
 People ppp(name,sex);
 
 //拷贝构造函数
 People p1(ppp);
 cout<<"P1 name "<<p1.name<<endl;
 cout<<"P1 sex "<<p1.sex<<endl;
 
 //重载等号
 People p2;
 p2=p1;
 cout<<"P2 name "<<p2.name<<endl;
 cout<<"P2 sex "<<p2.sex<<endl;
 return 0;
}

原文地址:https://www.cnblogs.com/huochangjun/p/3092029.html