C++基础:构造函数与析构函数

article/2025/10/2 5:26:11

数据成员多为私有的,要对他们进行初始化,必须用一个公有函数来进行。同时这个函数应该在定义对象时自动执行一次。称为构造函数。

构造函数的用途:1)创建对象;2)初始化对象中的属性;3)类型转换

c语言:有空间即可操作

C++:有空间不一定能够操作,必须调动构造函数,来创建对象:有空间不一定有对象,有对象一定有空间;

类型名+(a,b):调动构造函数, 如 :int c1(1,2)

类型名+{a,b}:调动构造函数, 如:int c2{1,2}

类型名+{}:调动无实参的构造函数, 如:int c3{}

构造函数的定义与使用:

      构造函数是特殊的公有成员函数(在特殊用途中构造函数的访问限定可以定义成私有或者保护)。其特征如下:

1.函数名与类型名相同。

2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可以写成void。实际上构造函数有返回值,返回的就是构造函数所创建的对象;

3.在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期间也只调用这一次。

4.构造函数可以重载。严格地讲,类中可以定义多个构造函数,他们由不同的参数表区分,系统在自动调用时按照一般函数重载的规则原则一个执行。

5.构造函数可以在类中定义,也可以在类中声明,在类外定义;

6.如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数。

类名(void){ }

但是只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个。

#include<iostream>
using namespace std;
class Complex
{int Real;//实部int Image;//虚部
public:Complex() //缺省函数的构造{Real = 0.0;Image = 0.0;cout << "creat object:Complex()" << endl;}Complex(int r, int i) //带参数的构造函数{Real = r;Image = i;cout<< "creat object:Complex(int ,int)" << endl;}void print(){cout << "Real= " << Real << 't' << "Image= " << Image << endl;}
};
int main()
{Complex ca;Complex cb(1, 2);Complex cc = Complex(3, 4);Complex cd{ 5,6 };Complex ce();//是否可以构造对象return 0;
}

运行结果如下: 

 成员初始化表:

#include<iostream>
using namespace std;
class Complex
{int Real;//实部int Image;//虚部
public:Complex() :Real{}, Image{} //缺省函数的构造{cout << "creat object:Complex()" << endl;}Complex(int r, int i) :Real{ r }, Image{i} //带参数的构造函数{cout<< "creat object:Complex(int ,int)" << endl;}void print() const //常方法{cout << "Real= " << Real << '\t' << "Image= " << Image << endl;}
};
int main()
{Complex ca;Complex cb(1, 2);Complex cc = Complex(3, 4);Complex cd{ 5,6 };Complex ce();//是否可以构造对象return 0;
}

 练习:

1. 根据main中的提示,实现构造函数

 #include<iostream>
using namespace std;
class CDate
{
private:int year;int month;int day;
public:
CDate() :year{1}, month{1}, day{1}
CDate(int a,int b,int c) :year{a}, month{b}, day{c}
{
}
void Print()
{
cout << "year" << year << endl;
cout << "month" << month << endl;
cout << "day" << day << endl;
}
};int main()
{
CDate c1;
CDate car(2022, 5, 22);
c1.Print();
car.Print();
return 0;
}

运行结果:

 2. 根据main中的提示,实现构造函数

#include<iostream>
using namespace std;
const int len = 20;
class CGoods
{
private:char Name[len];int Amount;float Price;float Totle;
public:CGoods() :Name{'\0'}, Amount{}, Price{}, Totle{}{}CGoods(const char *a, int b, float c) :Name{ '\0'}, Amount{b}, Price{c}, Totle{b * c}{strcpy_s(Name, len, a);}void Print(){cout << "Name" << Name << endl;cout << "Amount" << Amount << endl;cout << "Price" << Price << endl;cout << "Totle" << Totle << endl;}
};

运行结果:

析构函数的定义:

        当定义一个对象时,C++自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,C++也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数即析构函数:

1. 函数名与类型名相同,但是需要在前面加‘~’,如:~CGoods()。

2. 析构函数无函数返回类型,与构造函数在这一方面是一样的,但析构函数不带任何参数。

3.一个类有一个也只有一个析构函数,这与构造函数不同。

4.对象注销时,系统自动调用析构函数。

4. 如果类说明中没有给出析构函数,则C++编译器会自动给出一个缺省的析构函数。

如:~类型名(){    }

#include<iostream>
using namespace std;
class Complex
{int Real;//实部int Image;//虚部
public:Complex() :Real{}, Image{} //缺省函数的构造{cout << "creat object: " <<this<< endl;}Complex(int r, int i) :Real{ r }, Image{i} //带参数的构造函数{cout<< "creat object: " <<this<< endl;}~Complex(){cout << "destroy object: " << this << endl;}void print() const //常方法{cout << "Real= " << Real << 't' << "Image= " << Image << endl;}
};
int main()
{Complex ca;Complex cb(1, 2);Complex cc = Complex(3, 4);Complex cd{ 5,6 };Complex ce();//是否可以构造对象return 0;
}

初始化:天生如此;赋值:后天改变

构建函数:获取资源; 析构函数:释放资源

析构函数没有形参。


http://chatgpt.dhexx.cn/article/lm8Hqpp4.shtml

相关文章

类的构造函数和析构函数、默认构造函数

前言 程序只能通过成员函数来访问数据成员&#xff0c;因此需要设计合适成员函数&#xff0c;才能成功地将对象初始化。 类构造函数专门用于构造新对象&#xff0c;将值赋给他们的数据成员&#xff0c;进行初始化。 构造函数名称与类名相同&#xff0c;没有返回值&#xff0…

c++中的构造函数和析构函数

类和对象中&#xff0c;包括构造函数和析构函数&#xff0c;比较重要&#xff0c;通过学习总结一下&#xff0c;以便以后可以回顾&#xff01; 目录 构造函数 1.默认构造函数 2.有参构造函数 3.委托构造函数 4.复制(拷贝)构造函数 5.移动构造函数 左值引用与右值引用 析…

C++类构造函数和析构函数

11.3 类构造函数和析构函数 构造函数&#xff1a;是为了在定义对象时自动初始化其成员变量的值。 构造函数没有返回值&#xff0c;也没有被声明为void类型&#xff1b;因此&#xff0c;构造函数没有声明类型。 11.3.1 声明和定义一个构造函数 构造函数原型&#xff1a;在这…

C++ 构造函数和析构函数可以是虚函数嘛?

简单总结就是&#xff1a;构造函数不可以是虚函数&#xff0c;而析构函数可以且常常是虚函数。 构造函数不能是虚函数 1. 从vptr角度解释 虚函数的调用是通过虚函数表来查找的&#xff0c;而虚函数表由类的实例化对象的vptr指针(vptr可以参考C的虚函数表指针vptr)指向&#x…

构造函数和析构函数顺序

父子类 1、构造顺序&#xff1a; 创建一个子类对象&#xff0c;则父类、子类的构造方法都执行&#xff0c;且是 先父类 构造方法&#xff0c;再子类构造方法 派生类的构造顺序&#xff1a;先父类&#xff0c;后子类&#xff0c;因为子类很有可能会用到从父类继承来的成员 2、析…

【C++】构造函数与析构函数

1. 概述 构造函数&#xff1a;用于初始化对象&#xff0c;没有返回值&#xff0c;函数名和类名相同&#xff0c;只有在对象初始化的时候才会被调用。构造函数的分类&#xff1a; 默认构造函数&#xff1a;是编译器自动生成&#xff0c;没有任何参数的构造函数。 有参构造函数&…

何时调用构造函数和析构函数

何时调用构造函数和析构函数 构造函数的作用是保证每个对象的数据成员都有何时的初始值。 析构函数的作用是回收内存和资源&#xff0c;通常用于释放在构造函数或对象生命期内获取的资源。 一般我们都知道构造和析构的次序&#xff1a; 构造从类层次的最根处开始&#xff0c…

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

在很多时候&#xff0c;当写了初始化&#xff0c;动态开辟的&#xff0c;需要写销毁函数&#xff0c;写了销毁函数之后&#xff0c;但是却忘记了调用这些函数&#xff0c;忘记调用初始化函数还好&#xff0c;编译器会报错&#xff0c;但是如果是忘记调用销毁函数&#xff0c;那…

c++构造函数和析构函数

一、构造函数和析构函数的特点 构造函数和析构函数是一种特殊的公有成员函数&#xff0c;每一个类都有一个默认的构造函数和析构函数&#xff1b;构造函数在类定义时由系统自动调用&#xff0c;析构函数在类被销毁时由系统自动调用&#xff1b;构造函数的名称和类名相同&#…

构造函数与析构函数

一&#xff0c;引言 由于c语言常常会忘记初始化与销毁&#xff0c;造成许多麻烦。所以c就引入了构造函数与析构函数&#xff0c;分别用来完成初始化与清理工作&#xff0c;且由编译器自动调用&#xff0c;这就避免了许多麻烦。 二&#xff0c;构造函数 构造函数是一个特殊的成…

构造函数和析构函数

文章目录 前言 1.构造函数<1>概念<2>特性 2.初始化列表<1>概念<2>特征 3.析构函数<1>概念<2.>特征 前言 如不清楚类的定义可以点击此篇文章&#xff1a;类的定义与引入 C为很么要引入构造函数和析构函数呢&#xff0c;前文讲到大佬引入了…

C++ 构造函数和析构函数 详解

目录 概述构造函数的分类1. 无参(默认)构造函数2. 有参构造函数3. 委托构造函数4. 复制(拷贝)构造函数5. 移动构造函数 构造函数调用规则析构函数 概述 C中用构造函数和析构函数来初始化和清理对象&#xff0c;这两个函数将会被编译器自动调用。对象的初始化和清理是非常重要的…

java异常处理及自定义异常

异常处理的实际上就是&#xff1a; 有风险的行为&#xff08;方法&#xff09;可能会将异常抛出&#xff08;throws&#xff09;。调用该方法的程序会尝试&#xff08;try&#xff09;去运行,运行的同时捕捉&#xff08;catch&#xff09;异常。 简而言之&#xff0c;就是对有…

java异常 — — 自定义异常

三、自定义异常 3.1、概述 为什么需要自定义异常类: Java中不同的异常类分别表示看某一种具体的异常情况&#xff0c;那么在开发中总是有些异常情况是SUN没有定义好的此时我们根据自己业务的异常情况来定义异常类。例如年龄负数问题&#xff0c;考试成绩负数问题等等。 在上…

JAVA自定义异常处理

自定义异常处理可以分为两种&#xff0c;一种是自定义编译处理&#xff0c;另一种是自定义运行处理 1.自定义编译处理需要创建一个异常类用于继承Exception类 重写构造器 在出现异常的地方用throw new 自定义对象抛出 作用&#xff1a;编译时异常时编译阶段就报错&#xff…

Java的自定义异常类

Java的异常处理机制可以让程序具有极好的容错性&#xff0c;让程序更加健壮。当程序运行出 现意外情形时&#xff0c;系统会自动生成一个 Exception对象来通知程序&#xff0c;从而实现将“业务功 能实现代码”和“错误处理代码”分离&#xff0c;提供更好的可读性。 Java把所…

Java自定义异常及统一处理,信息返回

开始操作 创建enums&#xff0c;exception包&#xff1a; enums包下&#xff1a; 创建BaseCodeEnum接口 创建Response类&#xff1a;为统一信息返回类 创建ResponseCode枚举类&#xff1a;在这里定义我们需要的异常 exception包下&#xff1a; 创建HandlerException类&#…

Java自定义异常类统一处理异常

当程序发生异常时&#xff0c;会返回一大堆不友好的内容&#xff0c;非常不美观&#xff01; 我们在写代码的时候&#xff0c;对异常处理一般是try catch或者抛出异常throws Exception。 try catch大家都知道&#xff0c;代码中大量的try catch会占用内存影响性能&#xff0c…

Java中的自定义异常

代码实现 自定义异常类型主要实现代码 public class Exception_demo extends Exception{//自定义异常&#xff0c;需要把自定义异常类继承于Exception异常类&#xff0c;自定义异常类属于异常类的子类public Exception_demo(){//构造方法也叫做构造器&#xff0c;构造方法的名…

【Java异常】自定义异常

Java中定义了大量的异常类&#xff0c;虽然这些异常类可以描述编程时出现的大部分异常情况&#xff0c;但是在程序开发中有时可能需要描述程序中特有的异常情况,例如在设计divide()方法时不允许被除数为负数。为了解决这样的问题,Java允许用户自定义异常&#xff0c;但自定义的…