IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++--构造函数-析构函数 -> 正文阅读

[C++知识库]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:构造函数需要提供参数,要用参数来进行构造申请资源,析构函数不需要提供参数。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:31:12  更:2022-05-01 15:31:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 4:48:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码