【C++面向对象】2.构造函数、析构函数

文章目录

  • [【 1. 构造函数 】](#【 1. 构造函数 】)
    • [1.1 带参构造函数--传入数据](#1.1 带参构造函数--传入数据)
    • [1.2 无参构造函数--不传入数据](#1.2 无参构造函数--不传入数据)
    • [1.3 实例](#1.3 实例)
    • [1.4 拷贝构造函数](#1.4 拷贝构造函数)
  • [【 2. 析构函数 】](#【 2. 析构函数 】)

【 1. 构造函数 】

  • 类的构造函数是类的一种特殊的成员函数,它会 在每次创建类的新对象时执行
  • 构造函数的名称与类的名称是完全相同的 ,并且 不会返回任何类型 ,也不会返回 void。构造函数可 用于为某些成员变量设置初始值

1.1 带参构造函数--传入数据

  • 法1
cpp 复制代码
class Complex
{
	private: 
		double x;
		double y;
	public:
		Complex(); //无参构造函数
		Complex(double, double); //带参构造函数
		void Complex_Printf(void); //输出函数
};

//带参构造函数--形式1
Complex::Complex(double a, double b) 
{
	x = a;
	y = b;
}
  • 法2
cpp 复制代码
class Complex
{
	private: 
		double x;
		double y;
	public:
		Complex(); //无参构造函数
		Complex(double, double); //带参构造函数
		void Complex_Printf(void); //输出函数
};
//带参构造函数--形式2
Complex::Complex(double a,double b) :x(a), y(b) { };

1.2 无参构造函数--不传入数据

  • 法1
cpp 复制代码
class Complex
{
	private: 
		double x;
		double y;
	public:
		Complex(); //无参构造函数
		Complex(double, double); //带参构造函数
		void Complex_Printf(void); //输出函数
};
//无参构造函数:默认值x=2,y=1
Complex::Complex()
{
	x=2;
	y=1;
};
  • 法2
cpp 复制代码
class Complex
{
	private: 
		double x;
		double y;
	public:
		Complex(); //无参构造函数
		Complex(double, double); //带参构造函数
		void Complex_Printf(void); //输出函数
};
//无参构造函数:默认值x=2,y=1
Complex::Complex() :x(2), y(1) { };

1.3 实例

cpp 复制代码
// 【Complex.h】
#pragma once

class Complex
{
	private: 
		double x;
		double y;
	public:
		Complex(); //无参构造函数
		Complex(double, double); //带参构造函数
		void Complex_Printf(void); //输出函数
};
cpp 复制代码
// 【 Complex.cpp 】
#include "Complex.h"
#include <iostream>
using namespace std;

//无参构造函数:默认值x=2,y=1
Complex::Complex() :x(2), y(1) {};

//带参构造函数:赋初值
Complex::Complex(double a, double b) 
{
	x = a;
	y = b;
}

//输出函数,根据实部x和虚部y,输出对应的复数
void  Complex::  Complex_Printf(void)
{
	if      (!x && !y)        cout << '0' << endl;			     //{0}  {0}   :0
	else if (x  && !y)        cout << x << endl;                 //{≠0}{0}   :x
	else if (!x && y == -1)   cout << '-i' << endl;              //{0}  {-1}  :-i
	else if (!x && y == 1)    cout << 'i' << endl;               //{0}  {1}	  :i
	else if (!x)              cout<<y<<'i'<<endl;				 //{0}  {else}:yi
	else if (x && y == 1)     cout << x << "+i" << endl;         //{≠0}{1}   :x+i
	else if (x && y == -1)    cout << x << "-i" << endl;         //{≠0}{-1}  :x-i
	else if (y > 0)           cout << x << '+' << y << 'i'<<endl;//{≠0}{>0}  :x+yi ,y>0
	else                      cout << x <<y << 'i' << endl;		 //{≠0}{<0}  :x-yi ,y<0
}
cpp 复制代码
// 【 Main.cpp 】
#include <iostream>
#include "Complex.h"
using namespace std;

int main(void)
{
	Complex a;
	Complex b(0, 0);
	Complex c(0.2, 3.7);
	Complex d(0, 1);
	Complex e(2, 0);
	Complex f(3, -5);
	a.Complex_Printf();
	b.Complex_Printf();
	c.Complex_Printf();
	d.Complex_Printf();
	e.Complex_Printf();
	f.Complex_Printf();
	return 0;
}

1.4 拷贝构造函数

  • 拷贝构造函数是一种特殊的构造函数,它在创建对象时,是 使用同一类中之前创建的对象来初始化新创建的对象。
  • 如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
  • 拷贝构造函数通常用于:
    • 通过 使用另一个同类型的对象来初始化新创建的对象
    • 复制对象把它作为参数传递给函数。
    • 复制对象,并从函数返回这个对象。
  • 拷贝构造函数的常见形式:
cpp 复制代码
classname (const classname &obj) 
{
   // 构造函数的主体
}
  • 实例1:
  • Line line(10); // 创建一个Line类的对象line,会调用构造函数,输出 "调用构造函数"
  • display(line); // 使用 line 作为参数传入display函数中时,系统首先会调用拷贝构造函数为 line 进行复制创建得到一个临时副本,输出 "调用拷贝构造函数并为指针 ptr 分配内存"
    系统使用该副本在 display 函数中 进行操作,输出 "line 大小 :10" ,display 函数结束后该副本作为局部变量被回收,输出 "释放内存"
  • 对象 Line 在主程序结束前 也将被回收,输出 "释放内存"
cpp 复制代码
#include <iostream>

using namespace std;

class Line
{
   public:
      int getLength( void );
      Line( int len );             // 简单的构造函数
      Line( const Line &obj);      // 拷贝构造函数
      ~Line();                     // 析构函数

   private:
      int *ptr;
};

// 构造函数
Line::Line(int len)
{
    cout << "调用构造函数" << endl;
    // 为指针分配内存
    ptr = new int;
    *ptr = len;
}

// 拷贝构造函数 
Line::Line(const Line &obj)
{
    cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;
    ptr = new int;
    *ptr = *obj.ptr; // 拷贝值
}

// 析构函数 
Line::~Line(void)
{
    cout << "释放内存" << endl;
    delete ptr;
}

// 成员函数 
int Line::getLength( void )
{
    return *ptr;
}

// 外部函数 
void display(Line obj); 

// 程序的主函数
int main( )
{
   Line line(10);
   display(line);
   return 0;
}

// 一个外部函数 
void display(Line obj)
{
   cout << "line 大小 : " << obj.getLength() <<endl;
}
  • 实例2:
  • Line line1(10); // 创建一个Line类的对象line1,会调用构造函数,输出 "调用构造函数"
  • Line line2 = line1; // 创建一个Line类的对象line2 且 lin2 是由 lin1 复制得到,即调用了拷贝构造函数,输出 "调用拷贝构造函数并为指针 ptr 分配内存"
  • display(line1); // 使用 line1 作为参数传入display函数中时,系统首先会调用拷贝构造函数为 line1 进行复制创建得到一个临时副本,输出 "调用拷贝构造函数并为指针 ptr 分配内存"
    系统使用该副本在 display 函数中 进行操作,输出 "line 大小 :10"
    display 函数结束后该副本作为局部变量被回收,输出 "释放内存"
  • 同样地, display(line2); // 使用 line2 作为参数传入display函数中时,系统首先会调用拷贝构造函数为 line2 进行复制创建得到一个临时副本,输出 "调用拷贝构造函数并为指针 ptr 分配内存"
    系统使用该副本在 display 函数中 进行操作,输出 "line 大小 :10"
    display 函数结束后该副本作为局部变量被回收,输出 "释放内存"
  • 对象 Line1 和Line2 在主程序结束前 也将被回收,分别输出 "释放内存"
cpp 复制代码
#include <iostream>

using namespace std;

class Line
{
   public:
      int getLength( void );
      Line( int len );             // 简单的构造函数
      Line( const Line &obj);      // 拷贝构造函数
      ~Line();                     // 析构函数

   private:
      int *ptr;
};

// 构造函数
Line::Line(int len)
{
    cout << "调用构造函数" << endl;
    // 为指针分配内存
    ptr = new int;
    *ptr = len;
}

// 拷贝构造函数 
Line::Line(const Line &obj)
{
    cout << "调用拷贝构造函数并为指针 ptr 分配内存" << endl;
    ptr = new int;
    *ptr = *obj.ptr; // 拷贝值
}

// 析构函数 
Line::~Line(void)
{
    cout << "释放内存" << endl;
    delete ptr;
}

// 成员函数 
int Line::getLength( void )
{
    return *ptr;
}

void display(Line obj); 


// 程序的主函数
int main( )
{
   Line line1(10);

   Line line2 = line1; // 这里也调用了拷贝构造函数

   display(line1);
   display(line2);

   return 0;
}

// 外部函数 
void display(Line obj)
{
   cout << "line 大小 : " << obj.getLength() <<endl;
}

【 2. 析构函数 】

  • 类的析构函数是类的一种特殊的成员函数, 类的析构函数会在每次删除所创建的对象时执行。

  • 析构函数的 名称与类的名称是完全相同的,只是在前面加了个 波浪号(~) 作为前缀,它 不会返回任何值 ,也 不能带有任何参数

  • 析构函数 有助于在跳出程序(比如关闭文件、释放内存等)前释放资源

  • 如果程序里没有构造函数和析构函数,编译器在编译的时候会自动生成构造函数和析构函数,只是函数内没有任何操作。

  • 实例

cpp 复制代码
#include <iostream>

using namespace std;

class Line
{
   public:
      void setLength( double len );
      double getLength( void );
      Line();   // 这是构造函数声明
      ~Line();  // 这是析构函数声明

   private:
      double length;
};

// 成员函数定义,包括构造函数
Line::Line(void)
{
    cout << "Object is being created" << endl;
}
Line::~Line(void)
{
    cout << "Object is being deleted" << endl;
}

void Line::setLength( double len )
{
    length = len;
}

double Line::getLength( void )
{
    return length;
}
// 程序的主函数
int main( )
{
   Line line;

   // 设置长度
   line.setLength(6.0); 
   cout << "Length of line : " << line.getLength() <<endl;

   return 0;
}
相关推荐
小刘同学3212 分钟前
C++11 特性
c++·c11新特性
军训猫猫头2 分钟前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
success16 分钟前
【爆刷力扣-数组】二分查找 及 衍生题型
算法
真的想上岸啊16 分钟前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
m0_5522008220 分钟前
《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
c++·游戏·ue5
Orlando cron1 小时前
数据结构入门:链表
数据结构·算法·链表
丁劲犇1 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
牛客企业服务2 小时前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
charlie1145141912 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
呜喵王阿尔萨斯2 小时前
编程中的英语
c语言·c++