构造函数和析构函数浅谈

构造函数

构造函数专门为了构造新的对象,将值赋给他们的数据成员,构造函数的参数表示的不是类成员,而是赋给类成员的值,因为此参数名不能与类成员相同。

构造函数并没有声明类型,默认构造函数只可以有一个,可以通过参数不同来重载多个构造函数。

构造函数无法通过对象调用,因为在构造函数构造出对象之前,对象是不存在的。

class A
{
private:
	string m_str;
	int m_num;
public:
	A(const string &str, int num)
	{
		m_str = str;
		m_num = num;
	}
	void show()
	{
		cout << "m_str::" << m_str << endl << "m_num::" << m_num << endl;
	}; 
};
显示的调用构造函数:

A a = A("hello world", 1); 

A a("hello world",1);


每次创建类(甚至使用new动态分配内存)时,C++都使用类构造函数。如:

A *pA = new A("hello world", 1);
上面代码创建一个没有名字的类A的对象,并将该对象的地址赋给指针pA。

关于默认构造函数:

如果想创建对象,而不显示的初始化,则必须定义一个不接受任何参数的默认构造函数。一般有两种方法,

一、给已有的默认构造函数赋值:

A(const string &str = “error”, int num = 0);
二、重载一个没有参数的构造函数:

A();
因为默认构造函数只有一个,因此不要同时采用这两种方式。

注意调用隐式调用默认构造函数的情况:

A first;			//隐式调用默认构造函数
A second();			//这是一个声明,second是一个返回类A类型的函数
构造函数不仅可以初始化新的对象,如:

a2 = A("hello world", 1);
上面代码通过构造函数创建了一个新的、临时的对象,然后将其内容赋给对象a2.
一般情况下,既可以通过初始化,也可以通过赋值来设置对象的值,则应采用初始化方式。

C++11列表初始化:

A a = {"hello world",1};
A a("hello world",1);
A a{};
前两个声明调用含参数的构造函数,第三个声明调用默认构造函数。

注意事项:

1、有指针成员时,要注意浅拷贝和深拷贝问题。

2、为避免按位拷贝引起的错误,有时将构造函数和 = 赋值操作声明为私有的。

3、C++11接受一个参数的构造函数允许使用赋值语法将对象初始化一个值,如:

 当类的构造函数只有一个参数的时候可能隐式调用构造函数,即先隐式转换,然后调用构造函数。系统首先调用类型转换构造函数,将32创建为一个本类的临时对象,然后调用等号运算符重载,将该临时对象赋值给b

B b = 32;
这种特性可能会导致问题。

析构函数

和构造函数一样,析构函数也可以没有返回值和声明类型。与构造函数不同的是,析构函数没有参数。

一般写法如下:

~A();


在多态情况下,一般基类的构造函数声明为非虚,而析构函数声明为虚函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值