C++基础学习第六课(构造函数与析构函数)

第六课

1,构造函数

·创建一个对象时,常常需要做某些初始化的工作,例如对数据成员赋初值;

·为了解决这个问题,C++提供了构造函数,用来处理对象的初始化,构造函数是一种特殊的成员函数,与其他成员函数不同,不需要用户来调用它,而是在建立对象时自动执行;

1.1定义:

·C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫构造函数;

·构造函数在定义时可以有参数,因此可以发生重载;

·没有任何返回类型的声明;

1.2调用:

·自动调用(隐式):一般情况下,C++编译器会自动调用构造函数(无参构造);

·手动构造(显示):在一些情况下,需要手工调用构造函数(有参构造);

1.3构造和析构函数----调用机制

·结论:构造函数和析构函数都被对象自动调用了;

·构造和析构顺序:
构造:

·先 创建的对象 先构造;

·后 创建的对象 后构造;
析构:

·先 创建的对象 后释放;

·后 创建的对象 先释放;

1.4构造函数的分类

(1)·无参构造函数

·直接创建对象即可自动调用;

·注意:不要在对象后面加();

(2)有参构造函数

·注意:如果没写有参构造函数,C++编译器会自动生成一个无参构造函数;

​ 如果写了有参构造函数,就不再自动生成无参构造函数;

三种调用方法:

//括号法
Test t1(4,"a");
t1.show();
//等号法
Test t2(5,"b");
t2.show();
//匿名对象
Test(6,"c");
Test t3=Test(6,"c");//转正
//转正后,有了名字,且只调用一次构造函数,而且匿名对象不会被析构
t3.show();

(3)拷贝构造函数(赋值构造函数)

·用一个对象去初始化另一个对象时,需要拷贝;

·注意:定义之后进行赋值,不会调用拷贝构造函数;

(4)移动构造函数

·右值引用,移动语义,资源权限的转移;

2,析构函数

·用于释放对象

定义:

1,在对象生命周期结束时,会自动调用;

2,函数名和类名一样;

3,没有返回值类型声明;

4,析构函数不可用带参数,所以不可用重载;

3,浅拷贝和深拷贝

·深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体;

B复制A,修改A时,看B是否变化:
1,B改变,即浅拷贝(修改堆内存中的同一个值);
2,B不改变,即深拷贝(修改堆内存中的不同的值);

·浅拷贝:只是增加了一个指针指向已存在的内存地址;

·深拷贝:是增加了一个指针并且申请了一个新内存,使这个增加的指针指向这个新的内存;

事例:
Stu(const Stu& other)
{
	m_age = other.m_age;
	//浅拷贝写法
	//m_name=other.m_name;
	//深拷贝写法
	m_name = new char[strlen(other.m_name) + 1];
	strcpy(m_name, other.m_name);
}
4,类的组合—构造函数的初始化列表

·组合的概念:类中的成员是另一个类的对象;

//如果有一个类成员,而且这个成员它只有一个带参数的构造函数,没有默认构造函数,这时要对这个类成员进行初始化,就必须调用这个雷成员的带参数的构造函数;

·类的组合的构造函数设计:

·原则:不仅要负责对本类中的基本类型成员数据初始化,也要对对象成员初始化;

·声明形式:类名::类名(对象成员形参,本类成员形参):对象1(参数),对象2(参数),…

class A 
{
    public:
    A(int a)
    {
       m_a=a;
    }
    private:
    int m_a;
}
class B
{
    public:
    B(int b,int a):a1(a)
    {
       m_b1=b;
    }
    private:
    int m_b1;
    A a1;
}

特点:

·构造函数的顺序按照定义时的顺序进行;

5,委托构造
Stu(const char* name)
{
    m_name=(char*)malloc(sizeof(char)*strlen(name)+1);
    strcpy(m_name,name);
}
Stu(int age):Stu("ku")//使用其他构造函数帮你构造一部分
{
    m_age=age;
}
6,默认函数

Stu()=default;//显示指定默认构造函数,可以不写函数体;

7,删除函数

Stu(const Stu& n)=delete;//删除拷贝构造函数,禁止对象拷贝;

Stu hh(99);

Stu h(hh);//errror 无法拷贝

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值