moc 发表于 2018-8-28 22:22:38

027-C++之构造函数

本帖最后由 moc 于 2018-9-21 20:31 编辑

1、构造函数
        构造函数是C++中用于初始化对象状态的特殊函数;
        构造函数在对象创建时自动被调用(默认调用),隐式调用;
        构造函数和普通函数一样都遵循重载函数;
必要的时候,必须手工编写拷构造函数。
构造函数有三种:
        ①无参(默认)构造函数
        ②有参构造函数
        ③拷贝构造函数
2、无参构造和有参构造函数
无参构造函数是类的默认构造函数,当仅是声明一个类对象时,会默认调用无参构造函数。
有参构造函数的调用方法有三种:
class Test88
{
public:
        //有参构造函数
        Test88(int a)
        {
                m_a = a;
        }
        // 无参构造函数
        Test88()
        {
                m_a = 0;
        }
        // 拷贝构造函数
        Test88(/*const*/ Test88 &obj)// const 用于保护实参只读
        {
                cout << "我也是构造函数" << endl;
                m_a = obj.getA();
        }
private:
        int m_a;
};
int main()
{
        // 有参构造函数调用方法1:括号法
        Test88 t1(10);
        // 有参构造函数调用方法2:=法
        Test88 t2 = 20;
        // 有参构造函数调用方法3:手工调用
        Test88 t3 = Test88(30);
        system("pause");
        return 0;
}
上面直接在主函数中直接去创建对象,这样就需要显式的去调用对象的析构函数,来使得对象的生命周期得到完整的呈现。
于是可以给对象搭建一个舞台,让对象的生命周期的到完整的体现:
void playStage()
{

        Test88 t1(10);
        Test88 t2 = 20;
        Test88 t3 = Test88(30);
}
int main()
{
        playStage();
        system("pause");
        return 0;
}
3、拷贝构造函数的四种应用场景
定义:类名(const 类名 &obj)            // const 用于保护实参只读
应用场景1
利用 = 给一个已经生成好的对象给刚声明的新对象初始化。
Test88 t4;
Test88 t5 = t4;
应用场景2
利用 () 给一个已经生成好的对象给刚声明的新对象初始化。
Test88 t4;
Test88 t5(t4);
应用场景3
对象在从实参传给形参的时候,也就是调用一个函数,这个函数的参数中有类形参时,在生成形参时会调用拷贝构造函数。
class Location
{
public:
        Location(int xx = 0, int yy = 0)
        {
                X = xx;Y = yy;cout << "Constructor Object.\n";
        }
        Location(const Location & p)           //复制构造函数
        {
                X = p.X;Y = p.Y;   cout << "Copy_constructor called." << endl;
        }

        ~Location() { cout << X << "," << Y << " Object destroyed." << endl; }
        intGetX() { return X; }
        int GetY() { return Y; }
private:   intX, Y;
};

void f(Locationp)
{
        cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl;
}

void playobjmain()   //让对象唱戏的舞台
{
        Location A(1, 2);
        f(A);   // 构造函数应用场景3
        // 这里实参A传给形参p在建立局部变量p时会调用构造函数,返回函数时会调用局部变量p的析构函数
}

int main()
{
        playobjmain();
        system("pause");
        return 0;
}
应用场景4
在调用返回类对象的函数的时,在返回类对象时会创建一个匿名对象,此时会调用匿名构造函数。
void f(Locationp)
{
        cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl;
}

Location g()
{
        Location A(1, 2);
        // 在返回类对象A时,先执行用A去创建一个匿名类,(此时会调用拷贝构造函数),匿名类存放于堆区
        return A;      // 函数返回后就先析构局部对象A
}
void main101()
{
        Location B;
        B = g();// 用匿名对象给B赋值,然后马上析构匿名对象

}

void main102()
{
        Location B =g();// 直接把匿名对象交给B,不再创建对象B

}

int main()
{
        main101();
        main102();
        system("pause");
        return 0;
}
页: [1]
查看完整版本: 027-C++之构造函数