一、构造函数的分类和调用
分类方式:
按参数分:有参构造,无参构造(默认构造)
按类型分:普通构造,拷贝构造
三种调用方式: 括号法,显示法,隐式转换法
#include<iostream>
using namespace std;
class Person
{
public:
Person()
{
cout << "person无参构造函数的调用" << endl;
}
Person(int a)
{
age = a;
cout << "person有参构造函数的调用" << endl;
}
Person(const Person &p)
{
age = p.age; //如将某一个人身上所有的属性,拷贝到我身上
cout << "person拷贝构造函数的调用" << endl;
}
~Person()
{
cout << "person析造函数的调用" << endl;
}
int age;
};
void test1()
{
//1.括号法
//Person p1; //结果:无参、析构
Person p2(10); //结果:有参、析构
Person p3(p2); //结果:有参、拷贝、析构、析构
cout << "p2的年龄为:" << p2.age << endl;
cout << "p2的年龄为:" << p3.age << endl;
2.显示法
//Person p1; //结果:无参、析构
Person p2= Person(10); //结果:有参、析构
Person p3= Person(p2); //结果:有参、拷贝、析构、析构
//2.隐式转换法
Person p4 = 10; //相当于 Person p4= Person(10); 有参、析构
Person p5 = p4; //拷贝、析构
}
int main()
{
test1();
}
二、拷贝构造函数调用时机
1.使用一个已经创建完毕的对象初始化一个新对象
2.值传递的方式给函数参数传值
3.以值方式返回局部对象
#include<iostream>
using namespace std;
class Person
{
public:
Person()
{
cout << "person无参构造函数的调用" << endl;
}
Person(int age)
{
m_Age=age ;
cout << "person有参构造函数的调用" << endl;
}
Person(const Person &p)
{
m_Age = p.m_Age; //如将某一个人身上所有的属性,拷贝到我身上
cout << "person拷贝构造函数的调用" << endl;
}
~Person()
{
cout << "person析造函数的调用" << endl;
}
int m_Age;
};
void test1()
{
//1.使用一个已经创建完毕的对象初始化一个新对象
Person p1(20);
Person p2(p1);
cout << "p2的年龄为:" << p2.m_Age << endl;
//结果:person有参构造函数的调用
// person拷贝构造函数的调用
//p2的年龄为:20
//person析造函数的调用
//person析造函数的调用
}
//2.值传递的方式给函数参数传值
void doWork(Person p) //拷贝临时的副本
{
}
void test2()
{
Person p;
doWork(p);
}
//person无参构造函数的调用
//person拷贝构造函数的调用
//person析造函数的调用
//person析造函数的调用
//3.以值方式返回局部对象
Person doWork2()
{
Person p1;
cout << (int*)&p1 << endl;
return p1;
}
void test3()
{
Person p = doWork2();
cout << (int*)&p << endl;
}
//person无参构造函数的调用
//006FF9FC
//person拷贝构造函数的调用
//person析造函数的调用
//006FFAF4
//person析造函数的调用
int main()
{
test3();
}