博客
关于我
【C++初阶】进阶类和对象
阅读量:327 次
发布时间:2019-03-04

本文共 2575 字,大约阅读时间需要 8 分钟。

这进阶类和对象

构造函数

概念:

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

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载。
public : // 1.无参构造函数 Date () {   } // 2.带参构造函数 Date (int year, int month , int day ) {    _year = year ; _month = month ; _day = day ; }private : int _year ; int _month ; int _day ;};
  1. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定
    义编译器将不再生成。
  2. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参
    构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。
Date() {    _year = 1900 ; _month = 1 ; _day = 1; } Date (int year = 1900, int month = 1, int day = 1) {    _year = year; _month = month; _day = day; }

一般都写成全缺省构造函数。

7.重点:当我们不实现构造函数系统会自动生成那我们为什么要去实现构造函数呢?其实是有原因的因为C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如
int/char…,自定义类型就是我们使用class/struct/union自己定义的类型,看看下面的程序,就会发现
编译器生成默认的构造函数会对自定类型成员_t调用的它的默认成员函数

class Time{   public: Time() {    cout << "Time()" << endl; hour = 0; _minute = 0; _second = 0; }private: int _hour; int _minute; int _second;};class Date{   private: // 基本类型(内置类型) int _year; int _month; int _day; // 自定义类型 Time _t;};

这里Time 就是我们自定义的类型当我们去查看初始化数据时 自定义类型会用自己所实现的构造函数,而内置函数会默认初始化。

析构函数

概念:

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

析构函数是特殊的成员函数。

其特征如下:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
    析构函数(栈)
~SeqList() {    if (_pData) {    free(_pData ); // 释放堆上的空间 _pData = NULL; // 将指针置为空 _capacity = 0; _size = 0; } }
  1. 关于编译器自动生成的析构函数,是否会完成一些事情呢?下面的程序我们会看到,编译器生成的默认
    析构函数,对会自定类型成员调用它的析构函数。
~String() {    cout << "~String()" << endl; free(_str); }

拷贝构造函数

概念:

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

  1. 拷贝构造函数是构造函数的一个重载形式。
  2. 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
Date(const Date& d) {    _year = d._year; _month = d._month; _day = d._day; }
  1. 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷
    贝,这种拷贝我们叫做浅拷贝,或者值拷贝。
  2. 那么编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了,我们还需要自己实现吗?当然像
    日期类这样的类是没必要的。
    答案是有的因为当我们开创一块空间malloc当进行地址值传递时候,两个引用指向同一地址就会出现问题。

赋值操作符重载

运算符重载

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

函数原型:返回值类型 operator操作符(参数列表)
注意:
不能通过连接其他符号来创建新的操作符:比如operator@
重载操作符必须有一个类类型或者枚举类型的操作数
用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不 能改变其含义
作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的
操作符有一个默认的形参this,限定为第一个形参
.* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。这个经常在笔试选择题中出现

bool operator==(const Date& d1, const Date& d2){    return d1._year == d2._year; && d1._month == d2._month && d1._day == d2._day;}

赋值符重载

特点:

  1. 参数类型
  2. 返回值
  3. 检测是否自己给自己赋值
  4. 返回*this
  5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。
Date& operator=(const Date& d) {    if(this != &d) {    _year = d._year; _month = d._month; _day = d._day; } }

转载地址:http://fvlh.baihongyu.com/

你可能感兴趣的文章
C语言实现dijkstra(adjacence matrix)
查看>>
C语言学习从初级到精通的疯狂实战教程-徐新帅-专题视频课程
查看>>
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
查看>>
NAT工作原理
查看>>
Processes, threads and goroutines
查看>>
c++中的10种常见继承
查看>>
Vue学习—深入剖析渲染函数
查看>>
wxpython的Hello,World代码探索
查看>>
【数字图像处理】OpenCV3 学习笔记
查看>>
【单片机开发】智能小车工程(经验总结)
查看>>
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
查看>>
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
查看>>
Scala集合-数组、元组
查看>>
04 程序流程控制
查看>>
C++&&STL
查看>>
子集(LeetCode 78)
查看>>
1093 Count PAT‘s (25分) 含DP做法
查看>>
一篇解决JMM与volatile详解(二)
查看>>
数据结构之数组与经典面试题(二)
查看>>
无锁并发框架-Disruptor的使用(二)
查看>>