类的构造与析构函数

一、类的构造函数与析构函数

对于每个类的定义,都需要提供构造函数与析构函数。

构造函数:C++提供的特殊成员函数,专门用于构造新对象,将值赋给他们的数据成员,准确的说C++为成员函数提供了名称与使用语法,程序员完成定义,函数名与类名相同,构造函数的原型与函数头没有返回值,也没有被声明为void类型。(构造函数就没有声明类型)

1.1、构造函数声明与定义

构造函数的参数名不能与类成员相同,否则会出错。解决方法有两个:
a、在类的数据成员名中使用m_前缀;

class Stock
{
private:
	string m_company;
	long m_shares;
}

b、在成员名中使用后缀_

class Stock
{
private:
	string company_;
	long shares_;
}

1.2、构造函数声使用

C++提供了两种使用构造函数来初始化对象的方式。
a、显式的调用构造函数;

Stock food = Stock("World Cabbage", 250, 1.25);
Stock *pstock = new Stock("Electroshock Games", 18, 19.0);
//下面一条语句创建了一个Stock对象,将其初始化为参数提供的值,并将该对象的地址赋给pstock对象指针,此处对象没有名称,但是用指针来管理该对象。

b、隐式的调用构造函数,看起来会更紧凑;

Stock garment ("Furry Mason", 50, 2.5);

1.3、默认构造函数

默认构造函数是在未提供显式初始值时,用来创建对象的构造函数,可用于下面这种类对象生命的构造函数:

Stock fluffy_the_cat;

这种构造函数生效的机制是,当没有提供任何构造函数时,C++将自动提供默认构造函数,且是默认构造函数的隐式版本,不做任何的工作,对于Stock类来说,就是创建一个类对象,但是不初始化成员(就像创建一个int类型的变量,但是不赋初值一样)。默认构造函数定义举例如下:

Stock ::Stock()
{}

1.3.1 默认构造函数提供原则

a、不定义任何构造函数,编译器会提供默认的构造函数。
b、定义了构造函数,就必须提供默认构造函数,如果定义了非默认构造函数,但是没有提供默认构造函数,类对象声明将会出错。(可以防止创建未初始化的类对象)

1.3.2 默认构造函数定义方式

a、给已有构造函数的所有参数提供默认值

Stock::Stock (const string & co, long n, double pr) 	//已有构造函数
{
	company = co;
	...
}

Stock (const string & co = "Error", long n = 0, double pr =0);

b、另一种方式是通过函数重载来定义另一个构造函数, 即一个没有参数的构造函数。

Stock();

一个类只有一个默认构造函数,因此两种方式不能同时使用,使用上面两种中的任一种方式(没有参数或所有参数都有默认值)创建了默认构造函数后,都可以声明类对象,而不用进行显式的初始化。
通常应该初始化所有的对象,以确保对象的所有数据成员一开始就有已知的合理值,用户提供的默认构造函数通常会给所有的数据成员提供隐式的初始化值。以Stock为例的一个默认构造函数定义及使用如下:

Stock::Stock()
{
	company = "no name";
	shares = 0;
	share_val = 0.0;
	total_val = 0.0;
}

Stock first;
Stock *pre = new Stock;

1.4、构析构函数

1.4.1 析构函数的任务

构造函数创建对象后,程序跟踪该对象直至过期,此时程序调用析构函数完成对象的清理工作,且不承担其他重要的工作。
a、构造函数没有使用new创建对象指针,则析构函数没有什么任务要完成;
b、构造函数使用new运算符分配了内存,则析构函数需要使用delete来释放这些内存;

1.4.2 析构函数的形式

名称:在类名前加上~,比如Stock类的析构函数为 ~Stock()。
原型:没有声明类型也没有返回值,也没有参数 。
声明:类对象过期时析构函数将自动调用,因此必须有一个析构函数,如果程序员没有提供,则编译器将隐式的声明一个默认的析构函数,并在发现导致对象被删除的代码后,提供默认析构函数的定义。

1.4.3 析构函数的调用

调用:不应该在代码中显式的调用析构函数,具体的调用由编译器决定。
a、如果创建的是静态存储类对象,则其析构函数将在程序结束时自动调用。
b、如果创建的是自动存储类对象,则其析构函数将在程序执行完代码块时自动调用。
c、如果对象是通过new运算符创建的,则它将驻留在栈内存或自由存储区中,当使用delete释放内存时,其析构函数将会被自动调用。
d、程序可以创建临时对象来完成特定的操作(对类对象进行赋值的时候,先调用带参构造函数创建临时对象,再用临时对象给类对象赋值),程序将在结束对该对象的使用时自动调用其析构函数。

Stock stock2 = Stock (“Boffo Objects”, 22.0); //初始化,创建有指定值的对象
stock3 = Stock (“Nifty Foods”, 10, 50.0;					//赋值,通过让构造函数创建一个新的,临时的对象,,然后将其内容赋值给		
																						//stock3来实现,随后程序调用析构函数,删除该临时对象。			

1.4.4 const成员函数

这种成员函数保证了函数内不会修改调用对象,C++的解决办法是将const关键字放在函数的括号后面。当开发人员明该函数不做数据成员的修改,就应该将其声明为const。
类成员函数示例:
void show () const; //声明
void Stock::show() const //定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值