C++中有四类构造函数:默认构造函数、初始化构造函数、拷贝构造函数和移动构造函数。
当有了有参数的初始化构造函数,编译器就不会提供默认构造函数了。 只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。 所以如果我们定义了其他的构造函数,我们必须手动显示地定义一个默认构造函数。
- 默认构造函数和初始化构造函数:
class Student
{
public:
Student()
{
num=1001;
age=18;
}
Student(int n,int a):num(n),age(a){}
private:
int num;
int age;
};
int main()
{
Student s1;
Student s2(1002,18);
return 0;
}
- 拷贝构造函数
#include<iostream>
#include<string>
using namespace std;
class Student
{
public:
Student() {cout<<"调用默认构造函数"<<endl;}
Student(string name,string no):stuname(name),stuno(no)
{
cout<<"调用初始化构造函数"<<endl;
}
Student(const Student &s)
{
cout<<"调用拷贝构造函数"<<endl;
this->stuname=s.stuname;
this->stuno=s.stuno;
}
~Student() {cout<<"调用析构函数"<<endl;}
void printinfo(Student sss)
{
cout<<" student.stuname: "<<sss.stuname<<" student.stuno: "<<sss.stuno<<endl;
}
private:
string stuname;
string stuno;
};
int main()
{
string s1,s2;
s1="CRP";
s2="1906400038";
Student st(s1,s2);
st.printinfo(st);
Student st2(st);
st2.printinfo(st2);
return 0;
}
3. 移动构造函数
#include <iostream>
using namespace std;
class demo{
public:
demo():num(new int(0)){
cout<<"construct!"<<endl;
}
demo(const demo &d):num(new int(*d.num)){
cout<<"copy construct!"<<endl;
}
demo(demo &&d):num(d.num){
d.num = NULL;
cout<<"move construct!"<<endl;
}
~demo(){
cout<<"class destruct!"<<endl;
}
private:
int *num;
};
demo get_demo(){
return demo();
}
int main(){
demo a = get_demo();
return 0;
}
num指针变量采用的是浅拷贝的复制方式,同时在函数内部重置了d.num,有效避免了程序结束后,同一块堆空间被多次释放。
|