C++核心编程 4 类和对象-对象的初始化和清理

时间:2021-08-09
本文章向大家介绍C++核心编程 4 类和对象-对象的初始化和清理,主要包括C++核心编程 4 类和对象-对象的初始化和清理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

构造函数和析构函数

  对象的初始化和清理工作是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用结果是未知的,同样,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题。C++利用了构造和析构函数解决上述问题,这两个函数会被编译器自动调用,完成初始化和清理工作,对象的初始化和清理工作是编译器强制我们做的事,如果我们不提供构造和析构函数,编译器会提供,编译器提供的构造和析构函数是空实现;

  构造函数:主要作用在于创建对象时为对象的成员赋值,构造函数由编译器自动调用,完成对象的初始化和清理工作。

  语法:类名(){ }

  1、构造函数,没有返回值,也不写void

  2、函数名和类名相同

  3、构造函数可以有参数,因此可以发生重载

  4、程序调用对象时会自动调用构造,无需手动调用,而且只会调用一次

  析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

  语法:~ 类名(){ }

  1、构造函数,没有返回值,也不写void

   2、函数名和类名相同,在名称前加~

   3、构造函数不可以有参数,因此不可以发生重载

   4、程序调用对象时会自动调用析构,无需手动调用,而且只会调用一次

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

//对象的初始化和清理

class Person
{
//1、构造函数  进行初始化操作
/*
    1、构造函数,没有返回值,也不写void

  2、函数名和类名相同

  3、构造函数可以有参数,因此可以发生重载

  4、程序调用对象时会自动调用构造,无需手动调用,而且只会调用一次
 */
public:
    Person()
    {
        cout << "Person构造函数的调用" << endl;
    }
//2、析构函数  进行清理的操作
/*  1、构造函数,没有返回值,也不写void

   2、函数名和类名相同,在名称前加~

   3、构造函数不可以有参数,因此不可以发生重载

   4、程序调用对象时会自动调用析构,无需手动调用,而且只会调用一次
  */
    ~Person()
    {
        cout << "Person析构函数的调用" << endl;
    }

};


void test1()
{
    Person p;   //栈上的数据,test1执行完毕后,释放掉这个对象;
}


int main()
{    
    test1();

    system("pause");
    return 0;
}

构造函数的分类和调用

两种分类方式:

  按参数分:有参构造和无参构造

  按类型分:普通构造和拷贝构造

三种调用方式:

  括号法

  显示法

  隐式转换法

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

//构造函数的分类和调用
//分类

//按照参数分类  无参构造和有参构造
class Person
{
    //构造函数
public:
    Person()
    {
        cout << "Person无参(默认)构造函数的调用" << endl;
    }
    Person(int a)
    {
        age = a;
        cout << "Person有参构造函数的调用" << endl;
    }
    //拷贝构造函数
    Person( const Person &p )
    {
        //将传入人的身上的所有属性,拷贝到我身上;
        age = p.age;
        cout << "Person拷贝构造函数的调用" << endl;
    }

    ~Person()
    {
        cout << "Person析构函数的调用" << endl;
    }

    int age;
};

//调用
void test1()
{
    //1、括号法
    //Person p1;  //无参(默认)构造函数的调用
    //Person p2(10);  //有参构造函数的调用
    //Person p3(p2);  //拷贝构造函数的调用

    //注意事项
    //调用默认构造函数是,不要加()
    //因为下面这行代码,编译器会认为这是一个函数的声明,不会认为在创建对象
    //Person p1  ();
    //    ↓   ↓  ↓
    //void  func ();
     
 
    //cout << "p2年龄为:" << p2.age << endl;
    //cout << "p3年龄为:" << p3.age << endl;
    //2、显示法
    //Person p1;
    //Person p2 = Person(10);  //有参构造
    //Person p3 = Person(p2);  //拷贝函数  调用p2的拷贝构造函数

    //Person(10);  //匿名对象 特点:当前行之行结束后,系统立即回收掉匿名对象
    //cout << "aaaa" << endl;

    //注意事项2
    //不要利用拷贝构造函数 初始化匿名对象  编译器会认为Person(p3) == Person p3;会认为Person(p3)是对象的声明
    //Person(p3);

    //3、隐式转换法
    Person p4 = 10;  //相当于 写了 Person p4 = Person(10)
    Person p5 = p4;  //拷贝函数
}


int main()
{    
    test1();

    system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/kelin1122/p/15118075.html