/**
* 构造函数:
* 构造函数在形式上和类名相同且没有返回类
* 型。但是可以重载。形式如下:
* public: 类名(){}
* public: 类名(type param1, ...){...}
* 对于实例化的时候,给对象一个默认的属性。
* 当我们不写构造函数的时候,编译器会自动
* 帮我们添加默认的构造函数。且添加的构造
* 函数没有任何参数,也没有任何功能。
*
* 析构函数:
* 这个是想对于构造函数来说的,析构函数没
* 有参数,不可以重载也没有返回值。
*
* 注:当class提供了有参或者无参显式的构造
* 函数后,系统就不会再提供默认的无参
* 构造函数。
* 但是依然会提供默认的拷贝构造函数。
* 但是当显式提供拷贝构造函数后,系统
* 就不会再提供默认的无参构造函数和拷贝
* 构造函数。
* 但是还是会提供默认的析构函数。
*
* 也就是,当程序员不提供构造和析构函数时。
* 编译器会自动提供默认的:
* 无参构造函数
* 拷贝构造函数
* 析构函数
* 这三个函数,当程序员显式提供了其中的一个
* 或者多个对应的函数后,编译器就不会再提供
* 对应的默认的函数。
*
* 注:拷贝构造函数疑问:
* 1、为什么要使用引用类型。
* 答:当我们调用拷贝构造函数的时候,假设使用的是值传递的方式。
* 那么 举例:
* Cat{
* Cat(){}
* Cat(const Cat c)
* {}
* };
* ...
* Cat c2(c1);
* 在上面这句话中,我们会调用拷贝构造函数,然后在参数传递的时候,
* Cat c需要复制一下c1, 在复制c1的时候需要再一次调用拷贝构造函数。
* 就形成了无限调用拷贝构造函数,形成死循环。故必须要使用引用。
* 这样才能避免这种情况发生。
*
* 2、为什么要使用const?
* 答:其实不使用也行,但是要保证被拷贝的对象在拷贝函数调用过程中不会被改变。
* 加上const是为了安全,防止数据被意外修改。
*
*/
#include <iostream>
using namespace std;
class Person{
public:
//这里为了方便,我们直接把成员变量设置为public
char * p_name; //姓名
int p_age; //年龄
int P_money; //存款
int p_tall; //身高
//构造函数
Person() //默认构造函数 (无参构造函数)
{
cout << "Person 无参构造函数!" << endl;
}
Person(int a) //有参构造函数
{
cout << "Person 有参构造函数!" << endl;
}
Person(const Person &p) //拷贝构造函数
{
cout << "Person 拷贝构造函数!" << endl;
}
~Person() //显式的析构函数
{
cout << "Person 析构函数!" << endl;
}
};
//================================1、构造函数的测试=============================
void test01(void)
{
Person p1; //这里默认调用无参构造函数,注意无参的不能写成 Person p1(); 这是函数声明
Person p2(1); //这里默认调用有参构造函数
Person p3(p2); //这里调用拷贝构造函数
}
//==============================================================================
//================================2、系统不提供构造函数的情景1==================
class Dog{
public:
Dog(int a)
{
cout << "Dog 有参构造函数!" << endl;
}
~Dog()
{
cout << "Dog 析构函数!" << endl;
}
};
void test02(void)
{
//Dog d1; //这种写法编译失败,没有对应的构造函数,因为此时没有无参构造函数。
Dog d1(1); //这种写法才可以
Dog d2(d1); //这个时候仍然可以使用默认的拷贝构造函数
}
//==============================================================================
//================================3、系统不提供构造函数的情景2==================
class Cat{
public:
Cat(const Cat &c)
{
cout << "Cat 拷贝构造函数!" << endl;
}
~Cat()
{
cout << "Cat 析构函数!" << endl;
}
};
void test03(void)
{
//Cat c; //编译不通过,因为提供拷贝构造函数后不再提供默认无参构造函数
}
//==============================================================================
int main(void)
{
cout << "//================================1、构造函数的测试=============================" << endl;
test01();
cout << "//================================2、系统不提供构造函数的情景1==================" << endl;
test02();
return 0;
}
结果如下: