C++构造函数的种类及其作用

C++中有四类构造函数:默认构造函数初始化构造函数拷贝构造函数移动构造函数

当有了有参数的初始化构造函数,编译器就不会提供默认构造函数了。
只有当类没有声明任何构造函数时,编译器才会自动地生成默认构造函数。
所以如果我们定义了其他的构造函数,我们必须手动显示地定义一个默认构造函数。

  1. 默认构造函数和初始化构造函数
class Student
{
public:
    //默认构造函数
    Student()
    {
       num=1001;
       age=18;       
    }
    //初始化构造函数
    Student(int n,int a):num(n),age(a){}
private:
    int num;
    int age;
};
int main()
{
    //用默认构造函数初始化对象S1
    Student s1;
    //用初始化构造函数初始化对象S2
    Student s2(1002,18);
    return 0;
}

  1. 拷贝构造函数
#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,有效避免了程序结束后,同一块堆空间被多次释放。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值