C++的构造函数

一、构造函数的特点:

1、在创建对象时 自动调用

2、作用是:在创建对象的同时为成员变量进行赋值。

在实际开发中,经常用于成员变量的初始化预先打开文件等操作时。

二、C++定义类时,编译器会为类自动生成以下默认函数:

(1)无参构造函数;

(2)拷贝构造函数;但是倘若类中含有指针变量,那么这个默认的函数就隐含了错误。

        拷贝构造函数什么时候会被调用呢:

         一个对象以值传递的方式传入函数体;
         一个对象以值传递的方式从函数返回;
         一个对象需要通过另外一个对象进行初始化。

A(const A&);

(3)拷贝赋值构造函数;A& operator=(const A&);

(4)析构函数; 当程序员没有给类创建析构函数,那么系统会在类中自动创建一个析构函数,系统自动调用自动创建的析构函数,将对象释放。默认的析构函数不能删除new运算符在自由存储器中分配的对象或对象成员,如果类成员占用的空间是在构造函数中动态分配的,我们就必须自定义析构函数,然后显式使用delete运算符来释放构造函数使用new运算符分配的内存。

在C++11后,还增加了两个默认函数:

(5)移动构造;A(A&&)

(6)移动赋值构造;A& operator=(A&&)

默认构造函数形式:Student(){},只有当类没有声明任何构造函数时,编译器才会生成默认构造函数。

原则:

1、只要我们定义了任意一个其他构造函数,编译器的默认构造函数都不可以使用了!当用户自定义了有参构造函数时,编译器就不会再自动分配默认无参构造函数,但是其他拷贝构造、赋值构造编译器还是会分配,还是可以使用默认的!!!

2、当用户自定义了拷贝构造、赋值构造时,(主要是为了解决浅拷贝问题),再调用拷贝构造和赋值构造时就会调用用户自定义的,而非编译器分配的!

istream类的拷贝构造函数和赋值函数不可以直接使用,因而,需要使用引用来进行传递!

函数调用使用引用传参时,不会调用拷贝构造函数 等任何构造函数,但是使用值传递时,会调用拷贝构造函数,按参数的值构造一个临时对象,这个临时对象仅仅在函数执行时存在,函数执行结束之后调用析构函数。

拷贝构造函数在以下几种情况下会被使用:

(1)拷贝初始化,用=定义变量:

A b;

A a = b;

(2)将一个对象作为实参传递给非引用类型的形参;

(3)一个返回类型为非引用类型的函数返回一个对象;

(4)用花括号列表初始化一个数组中的元素或一个聚合类中的成员:
A pa[2] = {obj1, obj2};

(5)初始化标准库容器或调用其 insert/push 操作时,容器会对其元素进行拷贝初始化。

析构函数:

析构函数完成与构造函数相反的工作:释放对象使用的资源,销毁非静态数据成员。从语法上看,它是类的一个成员函数,名字是波浪号,没有返回值,也不接受参数。

当一个类没有定义析构函数时,编译器会为它合成析构函数。

合成的析构函数体为空,但这并不意味着它什么也不做,当空函数体执行完后,非静态数据成员会被逐个销毁。也就是说,成员是在析构函数体之后隐含的析构阶段中进行销毁的。

注意:指向一个对象的指针或引用离开作用域时,析构函数不会被调用。

A *obj1;

只有delete 指针时(释放指针 指向的 内存空间),指向的动态对象的生命期才结束,才会调用类的析构函数。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值