构造函数
构造函数专门为了构造新的对象,将值赋给他们的数据成员,构造函数的参数表示的不是类成员,而是赋给类成员的值,因为此参数名不能与类成员相同。
构造函数并没有声明类型,默认构造函数只可以有一个,可以通过参数不同来重载多个构造函数。
构造函数无法通过对象调用,因为在构造函数构造出对象之前,对象是不存在的。
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);
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();
在多态情况下,一般基类的构造函数声明为非虚,而析构函数声明为虚函数。