C++(十八)之构造函数介绍

/**
 * 构造函数:
 * 构造函数在形式上和类名相同且没有返回类
 * 型。但是可以重载。形式如下: 
 * 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;
} 

结果如下:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值