C++类的6个默认构造函数

1.构造函数。

2.析构函数。

3.拷贝构造函数。

4.赋值运算符重载。

5.取地址运算符重载(非const)。

6.取地址运算符重载(const)。

class Date
{
public:
	Date();                                    //构造函数
	~Date();                                   //析构函数  
	Date(Date &);                              //拷贝构造函数
	Date & operator=(const Date &d);           //赋值运算符重载
	Date * operator&(Date d);                  //取地址运算符重载
	const Date * operator&(Date d)const;       //取地址运算符重载

};

Date d1;                                      //调用构造函数
Date d2(d1);                                  //调用拷贝构造函数
Date d3;
d3 = d1;                                      //调用赋值运算符重载
Date *d4 = &d1;                               //调用取地址运算符重载(非const)
const Date*d5 = &d1;                          //调用取地址运算符重载(const)
C++编译器对这些函数的实现

        Date()
	{

	}
	~Date()
	{

	}
	Date(Date &)
	{

	}
	Date & operator=(const Date &d)
<span style="white-space:pre">	</span>{
<span style="white-space:pre">		</span>if (this != &d)
<span style="white-space:pre">		</span>{
<span style="white-space:pre">			</span>return *this;
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
	Date * operator&(Date d)
	{
		return this;
	}
	const Date * operator&(Date d)const
	{
		return this;
	}

构造函数

  构造函数是来处理对象的初始化。构造函数是一种特殊的成员函数,不需要用户来调用它,而是在建立对象时自动执行。

【构造函数特性】

1.函数名与类名相同,没有返回值。

2.构造函数不需要用户调用,也不能被用户调用,在建立对象时编译器会自动调用,在对象的生命周期内只调用一次。

3.如果用户没有显示定义构造函数,C++系统会自动生成一个构造函数。

4.构造函数可以重载。

5.无参的或者全缺省的构造函数称作默认构造函数,一个类中只能有一个默认构造函数。

Date(int year=1990,int month=1,int day=1)    //声明一个全缺省的默认构造函数
	{                                            
		_year=year;
		_month = month;
		_day = day;
	}
	Date()                                        //声明一个无参的默认构造函数
	{

	}
	在建立对象时如果写成
		Date d1;
编译系统就无法识别应该调用哪个构造函数,出现歧义性,编译时报错。

【构造函数的作用】

1.创建对象

2.初始化成员列表

3.隐式类型转换

析构函数

  析构函数的功能与构造函数的功能相反,在已创建的对象销毁时,编译器自动调用析构函数来完成一些资源清理。

【析构函数特性】

1.没有返回值,没有参数,不能重载。

2.一个类有且只有一个析构函数,调用几次构造函数,则调用几次析构函数。

3.先构造的对象后析构,后构造的对象先析构。

何时自动执行析构函数:

1.在函数内部创建的对象,当这个函数调用结束时,自动执行析构函数释放该对象。

2.static局部对象在函数调用结束时并不释放,也不调用析构函数,而是在main函数结束时才调用static对象的析构函数。

3.全局的对象在main函数结束时,调用全局对象的析构函数。

4.用new动态创建的对象,在用delete释放该对象时,调用该对象的析构函数。

  注意:析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。

拷贝构造函数

  拷贝构造函数是用来用已有对象创建一个新对象以,然后将已有对象的值一一赋给新对象 ,同样由编译器自动调用。
【析构函数特性】

1.只有一个参数,且类型为类类型的引用,常用const修饰(防止创建临时对象时无限递归,导致堆栈溢出)。

2.它是构造函数的重载。

3.如果没有显示定义,编译器会自动合成一个默认的拷贝构造函数。

何时调用拷贝构造函数:

1.用已有对象初始化建立一个新对象时:

        Date d1(2001,1,1);
	Date d2(d1);        
2.当函数的参数为类的对象时。在实参传递给形参时,创建一个实参的临时拷贝,然后赋给形参,此时调用拷贝构造函数。

void Test(Date d)
{

}
int main()
{
	Date d1(2000, 1, 1);
	Test(d1);
}
3.函数的返回值是类的对象时。在函数调用完时,创建一个返回值的临时对象,然后传给该函数的调用处。

Date Test()
{
	Date d2(2001, 1, 1);
	return d2;
}
int main()
{
	Date d1;
	d1 = Test();
}
注意:对象的赋值与对象的拷贝的不同。赋值是将一个已有对象的数据赋给另一个已有对象的成员,而拷贝是从无到有的建立一个新对象。

int main()
{
	Date d1(20021, 1, 1);
	Date d2(d1);              //拷贝,调用拷贝构造函数。    不调用d2的构造函数。

	Date d3;                  //调用d3的构造函数。
	d3 = d1;                  //赋值,调用赋值运算符重载函数,不调用拷贝构造函数。
}
赋值运算符重载
  对于赋值运算符重载函数有三个值得注意的地方:

1.返回值为类类型的一个引用。

  这是为了解决出现连续赋值的问题。

2.参数类型为const修饰的类类型的引用。

  用const修饰是防止函数内部对对象值的修改,提高安全性。

3.函数内部用if判断防止自身给自身赋值。

取地址运算符重载

  取地址运算符重载分为两种:一种是普通类型的对象;一种是const修饰的常类型对象。

  被const修饰的常类型对象只能调用同样具有const属性的函数或者成员,所有在第二种重载类型的末尾加const将默认的this指针修改为const this。此时不仅函数的返回值不能被修改,函数内部的成员也不能被修改。

  小结:

1.const成员函数可以访问非const对象的非const数据成员、const数据 成员,也可以访问const对象内的所有数据成员,而不能修改它们。

2.非const成员函数可以访问非const对象的非const数据成员、const数据成员,但不能访问const对象的任意数据成员。

3.在声明一个成员函数时,若该成员函数并不对数据成员进行修改操作,应尽可能将该成员函数声明为const成员。






### 回答1: C++不存在默认构造函数是指在定义一个C++时,如果没有显式地声明或定义默认构造函数,那么编译器就不会为该生成默认构造函数默认构造函数是一个没有任何参数的构造函数,它负责在创建对象时,给对象的成员变量初始化。当我们没有定义任何构造函数时,编译器会默认生成一个默认构造函数。但是,如果我们在中显式定义了任何其他构造函数,编译器就不会再生成默认构造函数了。 当一个没有默认构造函数时,我们在创建对象时必须显式地调用有参构造函数来进行对象的初始化。如果我们没有定义有参构造函数,那么编译器会报错,因为它无法自动创建默认构造函数。 为什么C++不存在默认构造函数呢?这是因为C++允许我们在定义时通过构造函数对对象进行初始化,这样可以确保对象的合法性和一致性。但是,如果自动生成默认构造函数,那么对象就会使用默认值进行初始化,可能会导致对象的成员变量处于一个不合理的状态,进而引发错误。 为了避免这种错误,C++规定没有显式定义或声明默认构造函数,是无法使用默认构造函数的。因此,我们必须显式地定义或声明一个有参构造函数来对对象进行初始化。这样可以保证对象始终处于一个合理的状态,提高程序的稳定性和安全性。 ### 回答2: C++如果没有显式声明构造函数,编译器会为其生成一个默认构造函数。然而,如果中有一些特殊的成员、基或者虚函数,编译器就无法生成默认构造函数。 当中存在有以下情况时,编译器无法生成默认构造函数: 1. 的成员或基没有默认构造函数:如果的成员或者基没有默认构造函数,编译器无法通过自动生成的默认构造函数来初始化这些成员或者基,因此无法生成默认构造函数。 2. 定义了带参数的构造函数:如果中定义了任何构造函数(不论是默认参数构造函数还是重载的构造函数),编译器会认为你提供的构造函数相对于默认构造函数更为重要,所以不会再为生成默认构造函数。 3. 定义了虚函数:当中定义了虚函数时,编译器无法自动生成默认构造函数,因为默认构造函数无法初始化虚函数的相关信息(例如虚函数表)。 为了解决没有默认构造函数的问题,可以手动为编写一个构造函数来完成初始化工作,或者使用初始化列表来初始化的成员或基。总之,在需要使用默认构造函数的地方,我们需要手动为提供一个默认构造函数,而不是依赖于编译器的默认构造函数。 ### 回答3: C++中,不存在默认构造函数的意思是,在定义一个时,如果没有显式地定义构造函数,那么编译器不会自动生成默认的构造函数。 构造函数是用来初始化对象的特殊成员函数,它会在对象创建时自动调用。当我们没有为定义任何构造函数时,编译器会自动生成一个默认构造函数。 然而,当我们显式地定义了一个或多个构造函数时,编译器就不会再自动生成默认构造函数了。这就是所谓的“不存在默认构造函数”。 如果我们需要创建一个没有默认构造函数的对象,我们就必须显式地定义自己的构造函数,以确保对象可以被正确地初始化。否则,在实例化该对象时将会产生编译错误。 值得注意的是,当定义了至少一个自定义构造函数后,如果我们还想要使用默认构造函数,则需要手动显式地定义一个默认构造函数。 例如,下面是一个没有默认构造函数例子: ```cpp class MyClass { public: MyClass(int value) { // 构造函数的实现 } }; ``` 在这个例子中,我们定义了一个名为MyClass的,它只有一个带有一个整型参数的构造函数。因此,如果我们在没有提供参数的情况下实例化MyClass的对象,将会出现编译错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值