C++学习笔记(七) 构造函数与析构函数(上)

构造函数

特点

  1. 构造函数是特殊的成员函数
  2. 创建类类型的新对象,系统自动会调用构造函数
  3. 构造函数是为了保证对象的每个数据成员都被正确初始化
  4. 函数名和类名完全相同
  5. 不能定义构造函数的类型(返回类型),也不能使用void
  6. 通常情况下构造函数应声明为公有函数,否则它不能像其他成员函数那样被显式地调用
  7. 构造函数被声明为私有有特殊的用途
  8. 构造函数可以有任意类型和任意个数的参数,一个类可以有多个构造函数(重载)

默认构造函数

  1. 不带参数的构造函数
  2. 如果程序中未声明,则系统自动产生出一个默认构造函数

转换构造函数

  1. 单个参数的构造函数
  2. 将其它类型转换为类类型
  3. 类的构造函数只有一个参数是非常危险的,因为编译器可以使用这种构造函数把参数的类型隐式转换为类类型

代码

    Test t(10);     // 带一个参数的构造函数,充当的是普通构造函数的功能

    t = 20;         // 将20这个整数赋值给t对象
                    // 1、调用转换构造函数将20这个整数转换成类类型 (生成一个临时对象)
                    // 2、将临时对象赋值给t对象(调用的是=运算符)

赋值与初始化区别

在初始化语句中的等号不是运算符。编译器对这种表示方法有特殊的解释

Test t = 10;        // 等价于Test t(10); 这里的=不是运算符,表示初始化。

t = 20;             // 赋值操作

Test t2;
t = t2;             // 赋值操作 t.operator=(t2);

可以通过重载赋值运算符来观察

Test& Test::operator=(const Test& other)
{
    cout<<"Test::operator="<<endl;
    if (this == &other)
        return *this;

    num_ = other.num_;
    return *this;
}

explicit

  1. 只提供给类的构造函数使用的关键字。
  2. 编译器不会把声明为explicit的构造函数用于隐式转换,它只能在程序代码中显示创建对象
//test.h
explicit Test(int num);
//test.cpp
Test::Test(int num)
{
    num_ = num;
    cout<<"Initializing "<<num_<<endl;
}
//01.cpp
Test t = 10;//错误:不存在从int到test的转换

析构函数

  1. 函数名和类名相似(前面多了一个字符“~”)
  2. 没有返回类型
  3. 没有参数
  4. 析构函数不能被重载
  5. 如果没有定义析构函数,编译器会自动生成一个默认析构函数,其格式如下:
    类名::~默认析构函数名( )
    {
    }
  6. 默认析构函数是一个空函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值