您的位置:首页 > 编程语言 > C语言/C++

C++类的4个默认成员函数

2016-10-19 17:07 211 查看
类的4个默认成员函数为:构造函数、拷贝构造函数、析构函数、运算符重载。

构造函数:

特殊的成员函数,名字和类名相同,创建类的类型对象时,由编译器自动调用,没有返回值,在对象的生命周期内只调用一次,(保证每个数据成员都有一个合适的初始值,可重载,实参决定调用那个构造函数,无参构造函数和带缺省值得构造函数都认是缺省构造函数,并且缺省构造函数只能有一个。构造函数不能用const修饰

class CDate

{

public:

CDate(); // 定义构造函数 函数名与类名相同

构造函数的作用:构建对象、初始化对象、类型转化

拷贝构造函数:

只有单个形参,而且该形参是对类型对象的引用。创建对象时使用已存在的同类对象来进行初始化。

对象的拷贝:对象名1=对象名2

对象的复制:类名 对象2(对象1) Box box2(box1);

class CDate

{

public:

CDate()

{}

CDate( const int year, const int month, const int day)

{

_iYear = year;

_iMonth = month;

_iDay = day;

}

CDate( const CDate& date) //拷贝构造函数

{

_iYear = date._iYear;

_iMonth = date._iMonth;

_iDay = date._iDay;

}

private:

int _iYear;

int _iMonth;

int _iDay;

};

特征:(1)构造函数的重载(2)参数必须使用同类型对象的引用传递(3)未显示定义,系统会自动合成一个拷贝构造函数一次拷贝类的数据从成员完成初始化。

使用情况:

1.对象实类化对象(CDate d1(1990,1,10);)

2.传值方式作为函数的参数(void FunTest(const CDate date))

3.传值方式作为函数返回值

CDate FunTest()

{

CDate date;

return date;

}

析构函数:

它的作用与构造函数功能相反,在对象呗销毁时,完成资源清理(注意不是删除对象,而是清理作用),其次析构函数还可以执行最后一次使用对象之后所执行的任何操作,构造函数名家~为析构函数类名。无返回值,一个类有且只有一个析构造函数。

*先构造的后析构,后构造的先析构

class CArray

{

public:

CArray(size_t capacity)

: _capacity(capacity)

{

_pData = ( int*)malloc(capacity*sizeof (int));

_size = 0;

}

~CArray() //析构函数 实现资源清理

{

if (NULL != _pData)

{

free(_pData);

_pData = NULL;

}

_size = 0;

_capacity = 0;

}

private:

int* _pData;

size_t _size;

size_t _capacity;

};

运算符重载:

一.什么是运算符重载

所谓函数重载就是对已有函数赋予新的含义,实现一名多用。而运算符也可以实现重载。例如:“<<”即是位移操作符也是流插入运算符,这就是运算符重载。当然今天我们讨论的是用户根据自己的需要对C++已提供的运算符进行重载。

c1=(3+4i),c2=(5-10i),在数学中c3=c1+c2可以直接实现虚部和实部的相加,但在C++中却不能直接用+对复数进行相加运算,因此就需要对运算符进行重载。

二.运算符重载的方法

运算符重载定义的方法是定义一个重载运算符函数(运算符重载实际是函数的重载)一般格式为:

函数类型 operator运算符名称(形参表列)

{ 对运算符的重载处理 }

Complex operator + (Complex& c1,Complex& c2)

三.重载运算符的规律

(1).C++不允许用户自己定义的新的运算符,只能对已有C++运算符进行重载,

.(成员访问运算符)、.*(成员在指针访问运算符)、::(域运算符)、sizeof(长度运算符)、?:(条件运算符) 这几个运算符不可重载

(2).不能通过连接其他符号来创建新的操作符:比如operator@;

void operator @(){}

(3)重载操作符必须有一个类类型或者枚举类型的操作数

int operator +(const int _iNum1 , const int _iNum2 )

// 报错

{

return ( _iNum1 + _iNum2);

}

typedef enum TEST {one ,two ,three };

int operator+(const int _iNum1 , const TEST _test )

{

return _iNum1;

}

(4)6、作为类成员的重载函数,其形参看起来比操作数数目少1

成员函数的操作符有一个默认的形参this,限定为第一个形

参。

CTest operator+(const CTest test1, const CTest

test2)const // 报错

{

return test1;

}

CTest operator+(const CTest test1)const

{

return test1;

}

(5)重载不能改变运算符运算对象的个数

(6)重载不能改变运算符的优先级别

(7)重载单目运算符在自增(自减)运算符重载函数中,增加一个int型形参,就是后置子增自减。

Time operator++(); //前置自增重载

Time operator++(int);//后置自增重载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: