类的成员函数

  • 1.构造函数
  • 2.析构函数
  • 3. 拷贝构造函数
  • 4.深浅拷贝
  • 5.运算符重载
    • 赋值运算符重载的特性:

1.构造函数

(构造函数的调用发生在对象的创建过程中,所以会牵扯到this指针传对象的地址问题。另外创建对象时,如果想调用无参类型构造函数,对象后边不能加括号,如果加括号编译器默认这是函数声明)

  1. 函数名与类名相同。
  2. 无返回值(并不是返回值为空)
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义,编译器将不再生构造函数
class Date
{public :// 1.无参构造函数Date (){}// 2.带参构造函数Date (int year, int month , int day ){_year = year ;_month = month ;_day = day ;}
private :int _year ;int _month ;int _day ;
};
void TestDate()
{Date d1; // 调用无参构造函数Date d2 (2015, 1, 1); // 调用带参的构造函数// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象Date d3();
} 

2.析构函数

  1. 概念
    析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成一些类的清理工作。
  2. 特性
    析构函数是特殊的成员函数。
    其特征如下:
    1 .析构函数名是在类名前加上字符 ~。
    2 .无参数无返回值。
    3 .一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
    4 .对象生命周期结束时,C++编译系统系统自动调用析构函数。
typedef int DataType;
class SeqList
{
public :SeqList (int capacity = 10){_pData = (DataType*)malloc(capacity * sizeof(DataType));assert(_pData);_size = 0;_capacity = capacity;}~SeqList(){if (_pData){free(_pData ); // 释放堆上的空间_pData = NULL; // 将指针置为空_capacity = 0;_size = 0;}}private :int* _pData ;size_t _size;size_t _capacity;
};

3. 拷贝构造函数

  1. 概念:
    构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象创建新对象时由编译器自动调用。
  2. 特征
    拷贝构造函数也是特殊的成员函数,其特征如下:
    1.拷贝构造函数是构造函数的一个重载形式。
    2.拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
class Date
{public:Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date(const Date& d){_year = d._year;_month = d._month;_day = d._day;}
private:int _year;int _month;int _day;
};
int main()
{Date d1;Date d2(d1);return 0; }
  1. 若未显示定义,系统生成默认的拷贝构造函数。 默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝我们称为浅拷贝

4.深浅拷贝

浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以 当继续对资源进项操作时,就会发生发生了访问违规。要解决浅拷贝问题,C++中引入了深拷贝。
深拷贝:如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。

//浅拷贝
class String
{public:String(const char* str):_str(new char[strlen(str) + 1]){strcpy(_str, str);}String(const String& s):_str(s._str){}String& operator=(const String& s){if (this != &s){_str = s._str;}return *this;}~String(){if (_str){delete[] _str;}_str = NULL;}
private:char* _str;
};
//深拷贝:
class String
{public:String(const char* str):_str(new char[strlen(str) + 1]){strcpy(_str, str);}String(const String& s){_str=new char[strlen(s)+1];strcpy(_str,s._str);}String& operator=(const String& s){if (this != &s){strcpy(_str,s._str);}return *this;}~String(){if (_str){delete[] _str;}_str = NULL;}
private:char* _str;
};

5.运算符重载

  1. 运算符重载
    C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
    函数名字为:关键字operator后面接需要重载的运算符符号。
    函数原型:返回值类型 operator操作符(参数列表)
    注意:
    ①不能通过连接其他符号来创建新的操作符:比如operator@
    ②重载操作符必须有一个类类型或者枚举类型的操作数
    ③用于内置类型的操作符,其含义不能改变,例如:内置的整型+,不能改变其含义
    ④作为类成员的重载函数时,其形参看起来比操作数数目少1成员函数的操作符有一个默认的形参this,限定为第一个形参
    ⑤* 、:: 、sizeof 、?: 、. 注意以上5个运算符不能重载。
// 全局的operator==
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;
};
bool operator==(const Date& d1, const Date& d2) {return d1._year == d2._year;&& d1._month == d2._month&& d1._day == d2._day; }
void Test ()
{Date d1(2018, 9, 26);Date d2(2018, 9, 27);cout<<(d1 == d2)<<endl; }

如果为了保证封装性,我们可以把运算符重载成类的成员函数

赋值运算符重载:

class Date
{
public :Date(int year = 1900, int month = 1, int day = 1){_year = year;_month = month;_day = day;}Date (const Date& d){_year = d._year;_month = d._month;_day = d._day;}Date& operator=(const Date& d){if(this != &d){_year = d._year;_month = d._month;_day = d._day;}return *this;}
private:int _year ;int _month ;int _day ;
};

赋值运算符重载的特性:

  1. 参数类型
  2. 返回值
  3. 检测是否自己给自己赋值
  4. 返回*this
  5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝,所以拷贝构造函数在面对类里边有资源进行管理的时候需要进行深拷贝。

类的6个默认成员函数相关推荐

  1. 【 C++ 】类和对象(中)—— 类的6个默认成员函数

    目录 1.类的6个默认成员函数 2.构造函数 构造函数概念 构造函数特性 3.析构函数 析构函数概念 析构函数特性 4.拷贝构造函数 拷贝构造函数概念 拷贝构造函数特性 5.赋值运算符重载 运算符重载 ...

  2. 类与对象:类的6个默认成员函数: 构造函数、析构函数、拷贝构造函数、赋值操作符重载、默认拷贝构造与赋值运算符重载的问题、const成员函数、 取地址及const取地址操作符重载

    1.类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类.任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数. 构造函数 析构函数 拷贝构造函数 赋值操作符重载 const成员函数 ...

  3. 【C++】类和对象的默认成员函数讲解

    文章目录 简介 构造函数※※※ 系统生成的默认构造函数的特性 构造函数的初始化列表 析构函数※ 拷贝构造函数※※※ 默认的拷贝构造函数 赋值重载函数 赋值运算符的重载格式 赋值运算符只能重载成类的成员 ...

  4. [c++ 简单的笔记] 类的6个默认成员函数

    -客亦知夫水与月乎? -哀吾生之须臾 羡长江之无穷. 文章目录 类的6个默认成员函数 构造函数 构造函数初始化列表 注意 explicit关键字(了解) 拷贝构造函数 务必自己写深拷贝的情况的情况 赋 ...

  5. 类的6个默认成员函数:构造函数、析构函数、拷贝构造函数、重载运算符、三/五法则

    文章目录 6个默认成员函数 构造函数 概念 默认构造函数的类型 默认实参 概念 默认实参的使用 默认实参声明 全局变量作为默认实参 某些类不能依赖于编译器合成的默认构造函数 第一个原因 第二个原因 第 ...

  6. 3-3:类与对象中篇——默认成员函数之构造函数和析构函数

    文章目录 一:类的默认6个成员函数 二:构造函数 (1)构造函数的概念 (2)构造函数注意事项 三:析构函数 (1)析构函数的概念 (2)析构函数注意事项 一:类的默认6个成员函数 如果一个类里面什么 ...

  7. C++类与对象(类中的六大默认成员函数)

    文章目录 类的默认成员函数 构造函数 概念 特征 自己定义构造函数 类中编写 传参方法 编译器自动生成的构造函数 定义变量方式 初始化规则 析构函数 概念 特性 自己定义析构函数 编译器自动生成的析构 ...

  8. 3-5:类与对象中篇——默认成员函数之运算符重载

    文章目录 一:运算符重载 (1)运算符重载 A:为什么要有运算符重载? B:如何进行运算符重载 C:注意 (2)赋值运算符重载 二:const修饰类的成员函数 一:运算符重载 C++ 允许在同一作用域 ...

  9. 3-4:类与对象中篇——默认成员函数之拷贝构造函数

    文章目录 (1)拷贝构造函数的概念 (2)拷贝构造函数的注意事项 (1)拷贝构造函数的概念 拷贝构造函数:用于创建一个与原对象一模一样的对象,也即拷贝构造函数=拷贝+构造函数.拷贝构造函数只有一个形参 ...

最新文章

  1. GiliSoft Video Editor 13中文版
  2. Xcode 8.0 doc 注释的问题
  3. 小黑小波比.sql语句截取字符串的子串
  4. Android App列表之游标ListView(索引ListView)
  5. 《底层逻辑》--思维导图
  6. 四阶龙格库塔方法求解一次常微分方程组
  7. 报表热切换是什么意思?如何做到?
  8. July 16th 模拟赛C T4 奶牛排队 Solution
  9. 算法训练--最小公倍数
  10. 2022.04.04树莓派最新镜像问题,树莓派如何设置初始化的账户和密码
  11. ubuntu/linux系统管理(12)Ubuntu 22.04 安装文件比对工具Meld替代Beyond Compare
  12. 阿里云ACP云计算错题集121-140
  13. mete40升级鸿蒙os的机型,首批升级鸿蒙OS系统的机型曝光!华为Mate40首先更新
  14. 基于产生式规则的动物识别系统
  15. Color2Gray: Salience-Preserving Color Removal实现
  16. 销售管理之调拨销售管理
  17. PN532开发指南(uart)
  18. DELL笔记本安装Ubuntu 14.04
  19. WSingle站群系统,全网唯一支持【站群】的WordPress小说主题!
  20. 报名丨麻省理工科技评论全球新兴科技峰会(北京)

热门文章

  1. 2022年资料员-岗位技能(资料员)复训题库及答案
  2. stat函数的使用说明
  3. centos 7 安装nagios
  4. 数字集成电路设计-4-工具之ic compiler
  5. Win 8下IE10/IE11提示“您还没有安装flash播放器,请点击这里安装”的解决办法
  6. AndroidTV开发教程(3)
  7. 自配料的误区,最好搭配净霉宝哦
  8. MapReduce之奇迹发生的地方:shuffle
  9. shell脚本注释方法
  10. 分水岭算法-python-opencv