C++中,类有六个默认函数,分别是:
目录
1、构造函数
2.析构函数
3.拷贝构造函数
4、赋值运算符重载函数
5、取地址操作符重载函数
6、const修饰的取地址符重载函数
1、构造函数
定义:在定义一个对象的同时,希望能给它的数据成员赋值——对象的初始化的成员函数,叫做构造函数。
在C++中,由于类的封装性,它不允许在类的非成员函数中直接访问类对象的私有和保护数据成员,不能在建立类的时候初始化。所以对于类对象数据成员的初始化工作就落到了类对象的成员函数身上,因为它们可以访问类对象的私有和保护成员。
#include<iostream>
using nmespace std;class Clock
{
public:Clock()//构造函数{cout << "Clock()" << endl;hour = 0;minute = 0;second = 0;}void Show(){cout << hour << ":" << minute << ":" << second << endl;}
private:int hour;int minute;int second;
};int main()
{Clock MyClock(8,30,30);MyClock.Show();return 0;
}
特点:
(1)函数名与类名是相同的
(2)在建立对象时,系统自动调用的函数。
(3)这个函数体是空的,默认构造函数并不具备任何功能。
(4)可以重载。
(5)不能够手动调用。
(6)没有返回值
(7)可以在类中定义,也可以在类外定义。
(8)如果用户为类定义了一个构造函数,系统就不会生成任何默认的构造函数。
(9)作为类的成员函数,构造函数可以直接访问类的所有数据成员,可以是内联函数,可以不带任何参数,可以带有参数表以及默认参数值。
PS: 构造函数与其他成员的区别:
(1)构造函数必须和类名相同,而一般成员函数不能和类名相同。
(2)构造函数主要功能在于类的对象创建时定义初始化的状态,没有返回值,不能用void修饰,其他函数可以有返回值,也可以没有,但是必须用void予以说明。
(3)构造函数不能被直接调用,一般成员函数在程序执行时被调用。
2.析构函数
(~构造函数名)
~Clock()
{cout << "~Clock" << endl;
}
定义:在特定对象使用结束后,需要进行一些清理工作由特殊成员函数完成,叫做析构函数。
特点:
(1)没有任何参数,不能被重载,但可以是虚函数,一个类只能有一个析构函数。
(2)没有返回值。
(3)析构函数一般由用户自己定义,在对象消失时由系统自动调用。
(4)默认析构函数是空函数,不做任何事。
3.拷贝构造函数
类名(类型 & 变量名)
Clock(Clock & p)//拷贝构造函数
{cout << "copy Clock(Clock &p)" << endl;hour = p.hour;minute = p.minute;second = p.second;
}
定义:用于在建立新对象时将已存在对象的数据成员值拷贝给新对象,即用一个已存在的对象去初始化一个新建立的对象。
形式:
类名(类名 & 对象名)
{ ... } //函数体
特点:
(1)拷贝构造函数其实是构造函数的重载
(2)拷贝构造函数的参数必须使用引用传参,不能使用传值传参
(3)如果用户没有定义拷贝构造函数,系统会默认缺省的拷贝构造函数,缺省的拷贝构造函数会依次拷贝类成员进行初始化
PS:
(1)默认的拷贝构造函数是浅拷贝。如果类成员变量有指针,考虑实现深拷贝。
(2)形参一定要加引用。
(3)拷贝构造函数与构造函数有且只会调用一个。
(4)用一个常量初始化新建立的对象时,调用构造函数,不调用拷贝构造函数。
(5)当对象作为函数的返回值时需要调用拷贝构造函数,此时C++将从堆中动态建立一个临时对象,将函数的返回的对象拷贝给该临时对象, 并把该临时对象的地址存储在寄存器里,从而由该临时对象完成函数返回值的传递。
(6)默认的拷贝构造函数是浅拷贝。
(7)在重新定义拷贝构造函数之后,默认拷贝构造函数和默认构造函数就不存在了。
在重新定义构造函数后,默认拷贝构造函数还在,默认构造函数不存在。
(8)在对象进行赋值时,拷贝构造函数不被调用。此时进行的是结构式的拷贝。
拷贝构造函数与对象赋值的区别:拷贝构造函数是用一个存在的对象去构造一个不存在的对象;对象赋值是当两个对象都存在,用一个对象的值去覆盖一个对象的值。
浅拷贝和深拷贝:
深拷贝:实现原对象和新对象之间数据成员之间的拷贝,而且可以为新的对象分配单独的内存资源。
浅拷贝:直接将原对象的数据成员值依次复制给新对象中对应的数据成员,并没有为新对象另外分配内存资源。
4、赋值运算符重载函数
运算符重载定义:使同一个运算符作用与不同类型的数据时导致不同行为的一种机制。
形式:返回值 operator 运算符(参数列表)
运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止改变内置类型的函义。
5个不能重载的运算符:
. (成员访问运算符)
.* (成员指针访问运算符)
:: (域运算符)
sizeof (长度运算符)
?: (条件运算符)
规则:
(1)重载后运算符的优先级与结合性不会改变
(2)不能改变原运算符操作数的个数
(3)不能重载C++中没有的运算符
(4)不能改变运算符的原有语义。
5、取地址操作符重载函数
Clock * operator()
{return this;
}
6、const修饰的取地址符重载函数
const Clock * operator&() const
{return this;
}