构造函数

数据多为私有,初始值为随机值,要想初始化,要用公有函数进行初始化。

更好的初始化方法:构造函数。

要求:

1.函数名要和类名一致。

2.构造函数没有返回值,也不能写void。

3.实例化对象之后,构造函数自动被调用,且只被调用一次(针对一个对象,有3个对象就调用3次,分别调用1次)。

4.构造函数可以重载,即初始化可以不一样。

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

6.如果类中没给出构造函数,系统会自动给出一个缺省的构造函数。

include<iostream>
using namespace std;
class Test{
public:
    Test(){  //构造函数名和类名一致
        cout<<"Create Test Object:"<<this<<endl;
        data = 0;  //初始化
    }
    Test(int d){
        data = d;
    }
    Test(int d,int x,int y){
        data = d;
        this->x = x;
        this->y = y;
    }
public:
    void InitTest(int d = 0){  //用公有函数进行初始化,没有构造函数初始化好
        data = d;
    }
private:
    int data;
    int x;
    int y;
};

//构造函数也可以在类外定义
Test::Test(int x,int y){
    this->x= x;
    this->y = y;
}

void main(){
    Test t1;  //执行第一个Test构造函数,注意这里不能写成Test t1();这样就变成声明一个函数,返回值为Test类型
    Test t2(10);  //执行第二个Test构造函数
    Test t3(1,2,3);  //第三个Test构造函数
    Test t4(10,20);  //第四个Test构造函数
}

注意:如果没有写构造函数,实例化对象之后,C++会默认产生一个缺省的构造函数。形如Test(){}  所以初始值还是随机值。但是只要定义了任何一个构造函数,则系统不会自动生成缺省的构造函数,因此参数列表要对应,否则会报错。缺省函数只能有一个,否则程序不知道执行哪一个。

class Test{
public:
    Test(){
    }
    //两者都是缺省函数,只能取其一
    Test(int d = 0){
        data = d;
    }
private:
    int data;
};

 

析构函数

要求:

1.析构函数名要和类名一致,但在前面要加一个~。如:~CGoods()。

2.析构函数没有函数返回类型,不能写void,但析构函数不带任何参数。

3.一个类只能有一个析构函数,析构函数可以缺省。

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

include<iostream>
using namespace std;
class Test{
public:
    Test(){  //构造函数名和类名一致
        cout<<"Create Test Object:"<<this<<endl;
        data = 0;  //初始化
    }
    ~Test(){
        cout<<"Free Test Object:"<<this<<endl;
    }
private:
    int data;
};

void main(){
    Test t1;
    Test t2;
    Test t3;
    Test t4;
}

注意:构造的顺序是t1-t4,析构的顺序则是t4-t1。

include<iostream>
using namespace std;
class Test{
public:
    Test(int d = 0){  //构造函数名和类名一致
        cout<<"Create Test Object:"<<this<<endl;
        data = d;  //初始化
    }
    ~Test(){
        cout<<"Free Test Object:"<<this<<endl;
    }
private:
    int data;
};

void main(){
    //Test t(10);  //先构造函数,data=10,再析构函数,由生到死
    Test t;
    t = 100;  //把整型数据赋值给一个对象,这是可行的
    int value;
    value = t;  //value = t.data,这是不行的
}

版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~