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]