构造函数
语法:
类名(){}
- 没有返回值;
- 函数名与类名相同;
- 可以有参数;
- 系统在调用对象时,会自动调用,无需手动调用,而且只会调用一次。
析构函数
语法:
~类名()
- 没有返回值;
- 没有参数;
- 程序在对象销毁前自动调用析构函数,无需手动调用,而且只会调用一次。
应用
#include <iostream>
#include <string>
using namespace std;
class student{
public:
string name;
int age;
int score;
void printf_information(void);
student();//构造函数
~student();//析构函数
};
student::student(){//构造函数
cout<<"hi"<<endl;
}
student::~student(){//析构函数
cout<<"see you "<<endl;
}
void student::printf_information(void)
{
cout<<" name: "<<name<<endl<<" age: "<<age<<endl<<" score "<<score<<endl;
}
int main()
{
cout << "Hello World"<<endl;
student stu;
stu.name="老王";
stu.age=20;
stu.score=59;
stu.printf_information();
return 0;
}
拷贝构造函数
//将值拷贝一份
class student
{
string name;
int age;
int score;
student(const student &p)//拷贝构造函数
{
name=p.name;
age=p.age;
score=p.score;
}
}
构造函数的调用
括号法
student stu1;//调用默认构造函数
student stu2(10);//调用有参构造函数
student stu3(stu1);//调用拷贝构造函数
显示法
student stu1;//调用默认构造函数
student stu2=student(10);//调用有参构造函数
student stu3=student(stu1);//调用拷贝构造函数
隐式转换法
student stu1=10;//调用有参构造函数
student stu2=stu1;//调用拷贝构造函数
构造函数调用规则
默认情况下,c++编译器至少会给一个类添加3个函数
- 默认构造函数
- 默认析构函数
- 默认拷贝构造函数
深拷贝与浅拷贝
浅拷贝:简单的赋值操作
深拷贝:在堆区申请内存,然后进行拷贝
浅拷贝带来的问题就是堆区的内存重复释放,因此我们要自己写一个拷贝构造函数,不使用系统默认的拷贝构造函数,代码如下所示:
#include <iostream>
#include <string>
using namespace std;
class student
{
public:
string name;
int age;
int * height;
student();
student(int age,int HEIGHT);//有参构造函数
student(const student & p);//拷贝构造函数
~student();
};
student::student()//无参构造函数
{
cout<<"默认"<<endl;
}
student::student(int m_age,int HEIGHT)//有参构造函数
{
height=new int(HEIGHT);
age=m_age;
cout<<"有参"<<endl;
}
student::student(const student & p)//拷贝构造函数
{
name=p.name;
age=p.age;
//运行拷贝构造函数时,对堆区内容进行拷贝时,重新开辟一块内存,然后将拷贝的内容,存放的新开辟的内存中;
height=new int(* p.height);
cout<<"拷贝"<<endl;
}
student::~student()//析构函数
{
if(height != NULL){ //运行析构函数时,释放堆区的内容
delete height;
height=NULL;
}
cout<<"析构"<<endl;
}
int main()
{
student stu1(18,160);
cout<<stu1.age<<" "<<* stu1.height<<endl;
student stu2(stu1);
cout<<stu2.age<<" "<<* stu2.height<<endl;
return 0;
}
初始化列表
class student
{
public:
string name;
int age;
int height;
student(string name,int age,int height):name(name),age(age),height(height)//初始列表格式
{
}
}
int main()
{
student stu1("老王",20,20);//初始化列表赋值操作
cout<<stu1.name<<" "<<stu1.age<<" "<<stu1.height<<endl;
return 0;
}