构造函数 和 析构函数
构造函数:主要为对象属性赋值
语法:类名(){}
注意:
1.无返回值也无void
2.函数名称与类名相同
析构函数
语法:~类名(){}
注意:
1.无返回值也无void
2.不可以有参数,不可发生重载
class Person
{
public://构造函数Person(){cout<<"Person 构造函数实例"<<"\n";}//析构函数~Person(){cout<<"Person 析构函数实例"<<"\n";}
};
构造函数的分类
按参数类型分:有参构造 和 无参构造
按类型分:普通构造 和 拷贝构造
调用方式:括号法 和 显式法 和 隐式转换法
#include<iostream>
using namespace std;
class Person
{
public://无参构造Person(){cout<<"Person 构造函数实例"<<"\n";}//有参构造Person(int a){age = a;cout<<"Person 有参构造实例"<<"\n";}//拷贝构造Person(const Person &p){age = p.age;//把对象的属性拷贝到自己身上}//析构函数~Person(){cout<<"Person 析构函数实例"<<"\n";}int age = 10;
};
//调用
//括号法
//注意点:调用无参函数的时候不要加上小括号(),会被认为是一个函数的声明
//eg: Person p();
void test01()
{Person p;Person p2(10);//有参函数调用Person p3(p2);//拷贝函数调用
}//显式法
//注意:不要利用拷贝函数来初始化匿名对象
//下列函数赋值的右边就是 匿名对象
void test02()
{Person p1;Person p2 = Person(10);Person p3 = Person(p2);
}//隐式转换法
void test03()
{Person p1;Person p2 = 10;Person p3 = p2;//相当于编辑器自动转换为 Person p3 = Person(p2);
}
int main()
{//test01();//test02();test03();return 0;
}
拷贝构造函数调用时机
三种方式:
1.使用一个已经创建完毕的对象来初始化一个新对象
2.值传递的方式给函数参数传值
3.以值方式返回局部对象
#include<iostream>
using namespace std;
class Person
{
public:Person(){cout<<"Person 默认函数构造实例"<<"\n";}Person(int age){cout<<"Person 有参函数实例"<<"\n";m_age = age;}Person(const Person &p){cout<<"Person 拷贝函数实例";}~Person(){cout<<"Person 析构函数实例"<<"\n";}int m_age;
};
void test01()
{Person p1(10);Person p2(p1);
}//值传递方式给函数参数传值
void doWork(Person p)
{}
void test02()
{Person p;doWork(p);
}//值方式返回局部对象
Person doWOrk()
{Person p1;return p1;
}
void test03()
{Person p2 = doWOrk();
}
int main()
{test03();return 0;
}