构造函数的分类以及调用
两种分类方式:
(1)按参数分为:有参构造(即:构造函数有参数)和无参构造(即:构造函数无参数,无参构造函数又叫默认构造)
(2)按类型分为:普通构造和拷贝构造
三种调用方式:
(1)括号法(2)显示法(3)隐式转换法
(1)括号法
#include<iostream>
using namespace std;
class person
{
public:
//无参构造函数
person()
{
cout << "person的无参构造函数调用" << endl;
}
//有参构造函数
person(int a)
{
cout << "person的有参构造函数调用" << endl;
age = a;
}
//拷贝构造函数
person(const person& p)
{
age = p.age;
cout << "person的拷贝函数调用" << endl;
}
~person()
{
cout << "person的析构函数调用" << endl;
}
int age;
};
int main()
{
//括号法
person p1;//默认构造调用
person p2(10);//有参构造函数调用
person p3(p2);//拷贝构造函数
cout << "p2的年龄为: " << p2.age << endl;
cout << "p3的年龄为: " << p3.age << endl;
return 0;
}
结果:
注意事项:调用默认构造函数时,不要加()
例如:
person p1();
在一个函数体的内部,可以写另一个函数的声明,上述代码会被编译器认为是一个函数的声明。
(2)显示法
#include<iostream>
using namespace std;
class person
{
public:
//无参构造函数
person()
{
cout << "person的无参构造函数调用" << endl;
}
//有参构造函数
person(int a)
{
cout << "person的有参构造函数调用" << endl;
age = a;
}
//拷贝构造函数
person(const person& p)
{
age = p.age;
cout << "person的拷贝函数调用" << endl;
}
~person()
{
cout << "person的析构函数调用" << endl;
}
int age;
};
int main()
{
//显示法
person p4;//调用默认构造
person p5 = person(11);//调用有参构造
person p6 = person(p5);//调用拷贝构造
return 0;
}
结果:
注意事项:
(1)
person(10);
该行代码称为匿名对象,匿名对象特点:当该行代码执行结束后,系统会立即回收掉匿名对象。
验证:
#include<iostream>
using namespace std;
class person
{
public:
//无参构造函数
person()
{
cout << "person的无参构造函数调用" << endl;
}
//有参构造函数
person(int a)
{
cout << "person的有参构造函数调用" << endl;
age = a;
}
//拷贝构造函数
person(const person& p)
{
age = p.age;
cout << "person的拷贝函数调用" << endl;
}
~person()
{
cout << "person的析构函数调用" << endl;
}
int age;
};
int main()
{
//显示法
//person p4;//调用默认构造
//person p5 = person(11);//调用有参构造
//person p6 = person(p5);//调用拷贝构造
person(10);
cout << "aahhahaa" << endl;
return 0;
}
结果:
(2)不要利用拷贝构造函数初始化匿名对象。
person(p6);
因为编译器会认为是对象声明。编译器会认为:person(p6) ==perosn p6,会导致对象重定义,从而导致代码报错。
(3)隐式转换法
#include<iostream>
using namespace std;
class person
{
public:
//无参构造函数
person()
{
cout << "person的无参构造函数调用" << endl;
}
//有参构造函数
person(int a)
{
cout << "person的有参构造函数调用" << endl;
age = a;
}
//拷贝构造函数
person(const person& p)
{
age = p.age;
cout << "person的拷贝函数调用" << endl;
}
~person()
{
cout << "person的析构函数调用" << endl;
}
int age;
};
int main()
{
//隐式转换法
person p7 = 10;//等价于:person p7=person(10);
person p8 = p7;
return 0;
}
结果: