构造函数与析构函数

构造函数:

        是一种特殊的成员函数,构造函数名与类名一样,没有返回值类型,也没有返回值,构造函数可以重载

        创建对象时初始化对象--为对象的成员变量赋初值

        在创建一个新对象时,系统会自动调用构造函数,如果没有显示给出构造函数,系统回自动给一个无参的构造函数。

        const在c语言中申明变量为只读不能直接修改的变量,在C++中申明一个常量

        不能在构造函数中赋值的可以使用成员初始化列表给数据成员赋值(实现构造函数时)

class MyClass {

public:
    //MyClass() {
    //    cout << "构造函数 = " << endl;
    //}//内联函数
    MyClass();
    MyClass(int val);
    const string  id;
    void setVal(int val);
private:
    string nane;
protected :
};

MyClass::MyClass() :id( "123") {
    cout << "构造函数 = " << id << endl;
}

 MyClass::MyClass(int val):id("999") {
     cout << "构造函数 = " << id << endl;
 }

void MyClass::setVal(int val) {
    cout << " vasl = " << val << endl;
}

int main()
{
    MyClass obj;
    MyClass obj1(5);
    obj.setVal(9);

    MyClass *p1 = new MyClass;
    MyClass *p2 = new MyClass(5);

    return 0;
}

析构函数:

        是一种特殊的成员函数,主要作用是在对象生命周期结束时进行清理,系统可以自动调用调用析构函数

        函数名与类名相同,使用~。没有返回值类型和返回值,也没有参数,是公有属性

        没有写时,系统回自动给出默认的析构函数

        析构函数可以通过对象主动调用,在系统生命周期结束时,会自动调用析构函数

        不是调用析构函数导致对象生命周期结束,而是生命周期结束会自动调用析构函数

        先构造的后析构

拷贝构造函数:(拷贝构造-函数)

        是一个特殊的构造函数,通过拷贝构造函数完成一个复制的过程。第一个参数是本类对象的引用,后面可以加参数列表

        先是构造函数,才可能是拷贝构造函数,可以使用系统默认,也可以自己定义

        调用时机:使用一个对象给另一个对象初始化,MyClass x3 = x;

                          使用一个对象构造另一个对象,MyClass x4 ( x);

                          函数的参数是类的对象

                          函数的返回值是类的对象

        深拷贝(自己声明了一块内存)与浅拷贝(默认拷贝)

        防止默认拷贝发生:写一个私有的拷贝构造函数,但不对他进行定义(主动让程序报错

class MyClass
{
public:
    MyClass();
    MyClass(int val,string name);
    ~MyClass();

    MyClass(const MyClass& obj);
    MyClass(const MyClass& obj, int n, int m);

public:
    int m;
    string str;
private:

};

MyClass::MyClass()
{
    m = 8797;
    str = "dsfhisdjfyhsd";
    cout << "无参构造函数 = " << m << "--------" << str << endl;
}

MyClass::MyClass(int val, string name):m(66),str("zh")
{
    cout << "有参构造函数 = " << val << "--------" << name << "--------"<< m << "--------" << str << endl;
}

MyClass::~MyClass()
{
    cout << "析造函数 = " << endl;
}

MyClass::MyClass(const MyClass& obj)
{
    m = obj.m;
    str = obj.str;
    cout << "拷贝构造函数 = " << m <<"--------" << str << endl;
}

MyClass::MyClass(const MyClass& obj,int dsf,int dfgd)
{
    m = obj.m;
    str = obj.str;
    cout << "拷贝构造函数 = " << m << "--------" << str<<"--------" << dsf<<"--------" << dfgd << endl;
}
void test1(MyClass obj) {
}

MyClass test2() {

#if 0
    MyClass sdfg;
    return sdfg;
#else 
    return MyClass();
#endif
}




    MyClass x;
    MyClass x2(8888,"ddsfhksdh");
    cout << " --------------------- " << endl;
    MyClass x3 = x;//使用一个对象给另一个对象初始
    MyClass x4 ( x);//使用一个对象构造另一个对象
    MyClass x5(x,657,4355);
    test1(x2);// 函数的参数是类的对象
    test1(x);// 函数的参数是类的对象
    test2();//函数的返回值是类的对象


    MyClass dfhgf = test2();

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值