C++面向对象-2-类的构造函数和析构函数

上一篇学习了C++中的类定义,用了两个练习题来演示一个class的属性和行为的定义和调用,以及展开了权限控制和一个类的属性还可以是其他类的一个实例。其中有好多代码是set和get, 写多了有时候很烦,当然写set和get方法是一个好习惯。例如Point,我们需要setX和setY, 有没有一个方法直接SetPoint(X,Y)呢, 这个就本篇要学习的类的构造函数。

 

区别:struct vs class

在学习构造函数之前,我们先学习一下C++中struct和class的区别,在C中struct是结构体,class和struct几乎没有区别,如果你不想使用class去写一个类,当然可以使用struct去写相关代码。简单来说,struct中的属性默认是public, 而class中的属性默认是private的,下面用代码来证明一下。

#include 
using namespace std;

struct A
{
    int a;
};

class B
{
    int b;
};

int main()
{
    A a1;
    a1.a = 100;

    B b1;
    b1.b = 100;
    system("pause");
    return 0;
}

不需要运行上面代码,在b1.b这个位置,IDE会报错,提示 11行不可以访问,原因如下:

在struct中,属性的权限默认是public, 在class中属性的权限默认是private, 行为也是一样。

 

构造函数

在C++中,类的构造函数会在类初始化的过程中就会执行构造函数。我们希望在一个类初始化的时候,就给这个类的属性进行设置初始化值,在C++中通过构造函数来实现。格式是这样的

class Point
{
    //构造函数
    Point()
    {

    }

private:
    int X;
    int Y;
};

构造函数的特点,函数名称和类的名称相同,前面没有返回值,可以有参数,也可以无参数。有参加就叫有参构造,无参数就叫无参构造。上面就是一个无参构造,主要我们定义了一个类,如果我们没有写这个无参构造,编译器在编译和运行代码的时候会自动给我们添加这个无参构造(空实现)。如果我们在定义类的时候,写了有参构造,编译器不会自动帮我们添加无参构造,建议我们自己写代码的时候,自己添加有参和无参构造函数。

下面代码来证明,类在初始化的时候,调用了构造函数,以下用无参构造函数演示。

#include
using namespace std;

class Point
{

public:

    //构造函数
    Point()
    {
	cout << "调用了构造函数"<< endl;
    }

private:
    int X;
    int Y;
};

int main()
{
    Point p;
    system("pause");
    return 0;
}

执行结果

总结:

构造函数语法:类名(){}
1.构造函数,没有返回值也不写void
2.函数名称与类名相同
3.构造函数可以有参数,因此可以发送重载
4.程序在调用对象的时候会自动调用构造函数。

 

析构函数

和类初始化相反的事情叫事后清理,在C++中,采用析构函数来实现类的运行结束前的清理操作。

析构函数语法:~类名(){}
1.析构函数,没有返回值也不写void
2.函数名称与类名相同,在名称前面加上符号~
3.析构函数不可以有参数,因此不可以发送重载
4.程序在对象销毁前会自动调用析构函数,无需手动调用而且只会调用一次

在上面构造函数基础上,添加析构函数的代码

#include
using namespace std;

class Point
{

public:

    //构造函数
    Point()
    {
	cout << "调用了构造函数"<< endl;
    }

    //析构函数
    ~Point()
    {
	cout << "调用了析构函数" << endl;
    }

private:
    int X;
    int Y;
};

int main()
{
    Point p;
    system("pause");
    return 0;
}

运行这个看起来并没有打印调用了析构函数,实际上是在输入任意键的一瞬间打印了调用析构函数。因为main函数是在内存的全局区,运行到system("pause"); 这里,我们main函数并没有结束,所以这个时刻的Point p这个对象没有结束,自然没有调用析构函数,但是执行return 0的一瞬间应该打印了析构函数的调用。为了看到打印效果,我们把类初始化代码放到一个内存代码局部区去。

#include
using namespace std;

class Point
{

public:

    //构造函数
    Point()
    {
	cout << "调用了构造函数"<< endl;
    }

    //析构函数
    ~Point()
    {
	cout << "调用了析构函数" << endl;
    }

private:
    int X;
    int Y;
};

void test01()
{
    Point p;
}

int main()
{
    test01();
    system("pause");
    return 0;
}

运行结果:

C++面向对象-2-类的构造函数和析构函数_第1张图片

在main()方法执行到test01()的时候,调用了test01()里面的Point p, 这个时候执行了Point类的初始化和清理操作,因为test01()执行完就从main()方法中弹出栈,Point p就从内存中回收,所以回收内存之前编译器自动调用了析构函数,所以能看到打印效果。

 

       构造函数分类:安装是否带参数,可以分无参构造和有参构造,按照类型分普通构造和拷贝构造,关于这个分类和构造函数的调用方法,下一篇来介绍。本篇学习了构造函数和析构函数,构造函数的作用是类初始化过程运行一次,给属性设置初始化值。析构函数的作用是,在类销毁之前执行一些操作,也只调用一次。

 

你可能感兴趣的:(C++学习笔记,C++,构造函数,析构函数)