【C++】类和对象(中)
创始人
2024-01-16 19:42:57
0

类和对象是面向对象语言的一个重要部分,承接上一话,我们直接开始这一章的内容。

文章目录

  • 一、类的6个默认成员函数
  • 二、构造函数
  • 三、析构函数
  • 四、拷贝构造函数
  • 五、赋值操作符重载
  • 六、 const成员函数
  • 七、取地址及const取地址操作符重载
  • 八、相关习题的练习和思维导图

提示:以下是本篇文章正文内容,下面案例可供参考

一、类的6个默认成员函数

1、1 概念

如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情 况下,都会自动生成下面6个默认成员函数。

6个默认成员函数的名称和作用如下:

1、初始化和清理:构造函数:主要完成初始化工作

                               析构函数:主要完成清理工作

2、拷贝赋值:       拷贝构造是使用同类对象初始化创建对象

                               赋值重载主要是把一个对象赋值给另一个对象

3、取地址重载:    主要是对普通对象和const对象取地址,这两个很少会自己实现

二、构造函数、

2、1 概念

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次

2、2特性

构造函数是特殊的成员函数,需要注意的是,构造函数的虽然名称叫构造,但是需要注意的是构造函数的主要任务并不是开空间创建对象,而是初始化对象

注意:一个类可以创建多个对象

其特征如下:

1、函数名与类名相同

2、无返回值

3、对象实例化时编译器自动调用对应的构造函数

4、构造函数可以重载

5、如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数

代码示例:

编译器会处理_a,通过A的构造函数

class A
{
public:A(){cout << "A()" << endl;_a = 0;}
private:int _a;
};

我们不写,编译器自动调用默认的构造函数,初始化类A的对象(是随机值)

 生成的默认构造函数只对自定义类型处理,对于内置类型不处理

3、3默认构造函数的种类

默认构造函数只有三种:

1、我们不写默认生成的

2、写的无参的

3、写的全缺省的

以日期类为例子:无参和带参的构造函数

// 1.无参构造函数Date (){}
// 2.带参构造函数Date (int year, int month , int day ){_year = year ;_month = month ;_day = day ;}
//3.我们写的全缺省
Date (int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明

 三、析构函数

3、1概念

析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

3、2特征

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值。

3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

5、编译器生成的默认析构函数,对会自定类型成员调用它的析构函数。

1、以日期类为例:

2、 示例2:自定义栈的析构

class Stack{public:Stack(int capacity = 10)//无需传参,这里要写全缺省{_a = (int*)malloc(sizeof(int) * capacity);assert(_a);_top = 0;_capacity = capacity;}//就算自己不写,编译器也会自动生成一个,我们写了编译器就不会自动生成了~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}private:int* _a;int _top;int _capacity;
};

 3、3析构的顺序

 特点:先构造,后析构

先创建出来的对象后调用析构函数完成析构

四、拷贝构造函数

4、1概念

举例说明:路上的路灯每一个都长得一模一样。那在创建对象时,可否创建一个与一个对象一某一样的新对象呢?

构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象 创建新对象时由编译器自动调用

4、2特征

1. 拷贝构造函数是构造函数的一个重载形式。

2. 拷贝构造函数的参数只有一个必须使用引用传参,使用传值方式会引发无穷递归调用

3. 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷 贝,这种拷贝我们叫做浅拷贝,或者值拷贝。

4、3代码示例

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;// 这里d2调用的默认拷贝构造完成拷贝,d2和d1的值也是一样的。Date d2(d1);return 0;
}

利用d1对象构造d2这个对象(调用的是默认拷贝构造)

日期类的自己写的拷贝构造,为了实现深拷贝

  //我们不写编译器会默认生成一个拷贝构造// 1、内置类型的成员会完成值拷贝,浅拷贝// 2、自定义类型的成员,会去调用这个成员的拷贝构造// 3、结论:一般的类,自己生成的拷贝构造就够用了。只有// 像栈这样的类自己直接管理资源,就要自己实现拷贝构造Date(const Date& d)//拷贝构造{_year = d._year;_month = d._month;_day = d._day;}

五、赋值操作符重载

5、1概念

C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。

函数名字为:关键字operator后面接需要重载的运算符符号。

函数原型:返回值类型 operator操作符(参数列表)

5、2五个注意点

  • 不能通过连接其他符号来创建新的操作符:比如operator@
  • 重载操作符必须有一个类类型或者枚举类型的操作数
  • 用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
  • 作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的
  • .* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。

最后一点尤为重要,是常考的考点。

5、3代码示例

以日期类为例子写一个全局的operator==

class Date
{
public://我们不写,编译器自动生成构造函数,对于内置类型成员不做处理//自定义类型成员会去调用这个成员的的默认构造函数Date(int year = 1, int month = 1, int day = 1)//无参的默认构造{_year = year;_month = month;//相当于是this->_month_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}int GetYear(){return _year;}bool operator==(Date d)//因为有一个是this,成员应该少一个{return _year == d._year&& _month == d._month&& _day == d._day;}
private:int _year;int _month;//只是声明,没有空间int _day;//在类里定义的,就会在前面加this
};
int main()
{Date d1(2022, 5, 16);//构造就是初始化的意思Date d2(2022, 5, 16);//自定义类型是不能直接比较的,需要运算符重载//内置类型,可以直接用各种运算符if (d1.operator==(d2))//d1默认传给了this{cout << "==" << endl;}  if (d1 == d2)//编译器会处理成对应的重载运算符等价于if (d1.operator==(d2)){cout << "==" << endl;}return 0;
}

运行起来的效果

 我们写的和编译器识别的

5、4赋值运算符重载

代码示例:日期类的赋值=

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}
Date& operator=(const Date& d){if(this != &d){_year = d._year;_month = d._month;_day = d._day;}}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2(2018,10, 1);// 这里d1调用的编译器生成operator=完成拷贝,d2和d1的值也是一样的。d1 = d2;return 0;
}
  •  五个特点

1. 参数类型

2. 返回值

3. 检测是否自己给自己赋值

4. 返回*this

5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。

六、const成员函数

7、1概念

将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

示意图:

 回答const有关的四个问题:

1. const对象可以调用非const成员函数吗?

不可以,权限的放大

2. 非const对象可以调用const成员函数吗?

可以, 权限缩小

3. const成员函数内可以调用其它的非const成员函数吗?

不允许,const成员函数调用非const成员函数,调用该const成员函数的对象已经被设置为const类型,只可以访问不能修改,在用该const成员函数访问其他非const成员函数可能会修改,因此const成员函数不能调用非const成员函数。

4. 非const成员函数内可以调用其它的const成员函数吗?

可以, 非const成员调用const成员权限缩小

七、取地址及const取地址操作符重载

7、1特点

这两个默认成员函数一般不用重新定义 ,编译器默认会生成

7、2日期类代码示例

重载取地址符和const取地址符

class Date
{ 
public :Date* operator&(){return this ;}const Date* operator&()const{return this ;}
private :int _year ; // 年int _month ; // 月int _day ; // 日
};

八、相关习题的练习和思维导图

本章内容思维导图

 例题1

 答案:C

解析:不能被重载的运算符就只有五个:点号. 三目运算符 ?:

 作用域访问限定符::运算符sizeof以及*

例题2

 答案:D

解析:此成员函数被定义为const常方法,代表在函数内部不能修改任何当前对象的数据成员,因此x不可能改变

答案: D

解析:A.赋值运算符在类中不显式实罚时,编译器会生成一份默认的,此时用户在类外再将赋值运算符重载为全局的,就和编译生成的默认赋值运算符冲突了,故赋值运算符只能重载成成员函数。 B.默认的赋值运算符是按成员成员,属于浅赋值,浅拷贝。

C.参数只有一个,另一个通过this指针传递。D.两个函数的调用场景不同,相互没有影响。

小结:

         本文继续承接上次的类和对象(上),讲述了类和对象相关方面的知识,包括6个默认构造函数,拷贝构造,析构函数,赋值、const等等,希望大家读后能有所收获。感谢大家的支持。

相关内容

热门资讯

高中趣味运动会加油稿 高中趣味运动会加油稿  无论结局是好是坏, 无怨无悔是我们的选择 ,高中趣味运动会加油稿。每当运动员...
运动会50字加油稿大全 运动会50字加油稿大全  一、运动会简介  运动会指体育运动的竞赛会,有奥运会等大型运动会,只是范围...
辩论赛新闻稿 辩论赛新闻稿(精选7篇)  随着社会在进步,我们都不可避免地要接触到新闻稿,新闻稿是公司/机构/政府...
观潮特级教师说课稿 观潮特级教师说课稿范文  作为一位优秀的人民教师,有必要进行细致的说课稿准备工作,是说课取得成功的前...
陈情表高三语文说课稿 陈情表高三语文说课稿(通用11篇)  作为一名教师,常常需要准备说课稿,说课稿有利于教学水平的提高,...
语文课程《妈妈睡了》说课稿 语文课程《妈妈睡了》说课稿范文  作为一名专为他人授业解惑的人民教师,往往需要进行说课稿编写工作,借...
清华大学毕业典礼讲话稿 清华大学毕业典礼讲话稿范文(精选9篇)  在现在社会,我们都不可避免地要接触到讲话稿,讲话稿可以起到...
足球脚内测传球说课稿 足球脚内测传球说课稿  在教学工作者实际的教学活动中,常常要根据教学需要编写说课稿,借助说课稿可以有...
大学新生运动会新闻稿范文简短 大学新生运动会新闻稿范文简短万里秋风丹桂,千般美景盛世,大学新生运动会新闻稿范文简短。学校第九届校田...
高三教师百日誓师发言稿 高三教师百日誓师发言稿 15篇  在充满活力,日益开放的今天,越来越多地方需要用到发言稿,发言稿的内...
领导升职表态发言稿 导语:晋升调薪主要适用于提升其职位或指派更加重要职责的人员,与员工的职位及管理职责挂钩。与绩效评估、...
春季期开学典礼发言稿 春季期开学典礼发言稿(通用5篇)  在充满活力,日益开放的今天,我们总不得不需要用到发言稿,发言稿具...
活动主持稿 活动主持稿15篇  在学习、工作生活中,我们都不可避免地要接触到主持稿,主持稿是主持人于节目进行过程...
运动会稿件 运动会稿件(精选15篇)  昔日环形的跑道,此时在你脚下却幻化为最美的彩虹。你就像一阵风,留给世界的...
证婚人讲话稿 证婚人讲话稿(通用10篇)  随着社会一步步向前发展,我们可以使用讲话稿的机会越来越多,讲话稿是讲话...
地理必修1《河流地貌的发育》... 人教版地理必修1《河流地貌的发育》说课稿  一、说教材  1.教材分析  本节课是位于人教版地理必修...
《植物妈妈有办法》说课稿 《植物妈妈有办法》说课稿(精选13篇)  作为一名老师,通常会被要求编写说课稿,说课稿有助于提高教师...
我是人民教师朗诵稿 我是人民教师朗诵稿范文(精选12篇)  在日常的学习中,大家一定没少看到经典的朗诵稿吧,朗诵是一种比...
《大灰狼开心了》说课稿 《大灰狼开心了》说课稿  一、 说教材  《大灰狼开心了》是我们这个学期教学计划里面高高兴兴主题中的...
《站立式起跑》说课稿 小学四年级体育《站立式起跑》说课稿(精选3篇)  作为一名无私奉献的老师,常常需要准备说课稿,借助说...