0
点赞
收藏
分享

微信扫一扫

C++--构造函数-析构函数

20.构造函数是在我们定义一种类型的变量时会自动被调用的函数。而且我们可以定义多个同名的构造函数--函数重载(参数不一样或者没有参数)。

#include <iostream>
using namespace std;
//构造函数:函数名和类名一样,而且没有返回函数
struct Date {
  int d,m,y;

//如果没有定义任何构造函数,那么编译器会自动生成一种构造函数
  Date(){
    d=1; m=1; y=2000;
    cout<<"default constructor!"<<endl;

  }
  Date(int dd){
    d=dd ;m=1; y=2000;
    cout<<"default constructor!"<<endl;

  }
  Date(int dd,int mm){
    d=dd; m=mm; y=2000;
    cout<<"default constructor!"<<endl;

  }
  Date(int dd,int mm,int yy){
    d = dd; 
    m = mm; 
    y = yy;
    cout<<"constructor!"<<endl;  //这里不确定是否调用了函数可以进行输出一下
}
  void init(){
    d = dd; 
    m = mm; 
    y = yy;
    cout<<"constructor!"<<endl;
  }
void print() {
  cout << y << "-"<< m << "-"<< d << endl;
}
int main() {

  Date day;
  Date day1(14);
  Date day2(14,4);  //会调用上面有两个参数的函数


  //构造函数在定义一个类的时候会自动调用这个函数
  Date day3(14,4,2000); //三个成员day.d day.m day.y传递参数

  //day.print();  //通过类Date对象day调用类Date的print方法
  //day.init(14,4,2000);  //通过类Date对象day调用类Date的init方法
  day.print(); //通过类Date对象day调用类Date的print方法
  day1.print();
  day2.print();
  day3.print();
  return 0;
}

注意:如果没有定义任何构造函数,那么编译器会自动生成一种构造函数。

21.在构造函数中剩下的内存没有释放掉,在销毁的时候需要把占用的内存释放掉就要用到析构函数

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
struct student {
  char *name;
  int age;
    student(char *n= "no_name", int a = 15){
      int len = strlen(n);
      name = new char[len+1]; //name指针没有指向任何一块内存,所以需要分配一块内存  
                              //还有结束字符,需要len+1
      strcpy(name,n);
      age = a;
      std::cout << "constructor!" << std::endl;

    }

  virtual ~student() {
    
    std::cout << "destructor!" <name << std::endl;
    delete[] name;  //这里把内存释放给了操作系统,否则会产生内存泄漏
  }

 };
void f() {
  student stu1;
  student stu2("wang");  //使用完要释放掉
  student stu3("zhang" , 23);
  std::cout << stu1.name << "\t" << stu1.age << std::endl;
  std::cout << stu2.name << "\t" << stu2.age << std::endl;
  std::cout << stu3.name << "\t" << stu3.age << std::endl;

  //执行完要销毁,销毁的时候要调用到析构函数
}

注意1:delete[] name;是为了防止内存泄漏。

注意2:一般初始化对象的时候是在构造函数里进行,当对象销毁的时候要把内存还给操作系统。

注意3:构造函数需要提供参数,要用参数来进行构造申请资源,析构函数不需要提供参数。

举报

相关推荐

0 条评论