面向对象编程(二)

构造函数与析构函数

1.构造函数
1)构造函数的特点:
构造函数可以有任意类型和任意个数的参数,你个类可以有多个构造函数(重载)
构造函数被声明为私有特殊的用途
函数名和类名完全相同
2)如果程序中未声明,则系统自动产生出一个默认构造函数,不带参数的构造函数
3)全局对象的构造函数先于main函数
4)当一个类存在构造函数时,手动加入参数
注:手动写入无参构造函数
2.析构函数
1)定义:函数名和类名相似(前面多了一个字符“~”)
没有返回类型,没有参数;析构函数不能被重载
如果没有定义析构函数,编译器会自动生成一个默认析构函数,默认析构函数是一个空函数。
2)析构函数在程序结束时被调用,构造函数与析构顺序正好相反。

Test *p = new Test(1,2,3);
delete p; // 调用析构函数

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

Test::Test()//不带参数称为默认构造函数
{
num_=0;
cout << “initing default!” << endl;
}
Test::Test(int num)//转换构造函数
{
num_=num;
cout << “initing!” << endl;
}
int main(void)
{
Test t(10);  //带一个参数的构造函数,充当的是普通构造函数的功能
t = 20;    //将20赋值给t对象
//1.调用转换构造函数将20转换成类类型,生成一个临时对象
//2.将临时对象赋值给t对象,调用的是=运算符
}

4.赋值与初始化的区别

Test& Test::operator = (const Test& other)
{
cout << “Test::operator = ” << endl;
if(this == &other)
{
    return *this;
}
num_ = other.num_;
return *this;
}
int main(void)
{
Test t = 10;   //等价于Test t(10);这里=表示初始化

t = 20; //赋值操作

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

5.explicit
只提供给类的构造函数使用的关键字
编译器不会把声明为explicit的构造函数用于隐式转换,他只能在程序代码中显示创建对象
6.构造函数初始化列表
1)推荐在构造函数初始化列表中进行初始化
构造函数的执行分为两个阶段:·初始化段 ·普通计算段

class Object
{
public:
    Object(int num = 0):num_(num),kNum_(num)
{
//kNum_ =100;
//refNum_ = num_;
cout << “Object” << num_ << “..........”<< endl;
}
~Object()
{
    cout << “~Object” << num_ << “..........”<< endl;
}
void DisplayKNum()
{
    cout << “kNum = ” << kNum_ << endl;
}
private:
int num_;
int kNum_;
};

2)对象成员及其初始化
·对象成员(对象所对应的类没有默认构造函数)的初始化,也只能在构造函数初始化列表中进行
·const成员的初始化只能在构造函数初始化列表中进行
·引用成员的初始化也只能在构造函数初始化列表中进行
7.拷贝构造函数
1)功能:使用一个已经存在的对象来初始化一个新的同一类型的对象
2)声明:只有一个参数并且参数为该类对象的引用
3)如果类中没有拷贝构造函数,则系统自动生成一个缺省复制构造函数,作为该类的公有成员

Test::Test(const Test& other):num_(othe.num_)
{
    cout << “copy init test!” << endl;
}

4)拷贝构造函数的调用情况
·用已有对象初始化对象会调用拷贝构造函数:Test t2(t1);
·当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用void func(Test t){ ………… }
·当函数的返回值是类对象,函数执行完成返回调用者时使用

Test func()
{
    Test t(10);
return t;   //返回临时对象
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值