本文主要给大家介绍了关于C++默认成员函数与运算符重载的相关内容,分享出来公的敬爱啊参考学习,话不多说,来一起看看详细的介绍:

一:类和对象的基础知识:类的定义,访问限定符,面向对象封装性,对象的大小计算等等。(编译环境为VS2015)
面向对象程序设计:
概念:(Object Oriented Programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
类:类的基本思想是数据抽象和封装。类的接口包括用户所能执行的操作;类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。要想实现数据抽线和封装,就得先定义一个抽象数据类型。
访问限定符:1.public(公有属性);2.private(私有属性,默认情况下就为此属性);3.protect(保护)
注:
1. public成员可从类外部直接访问,private/protected成员不能从类外部直接访问;
2. 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
3. 类体中如果没有定义限定符,则默认为私有的。
4. 类的访问限定符体现了面向对象的封装性。
例:定义一个日期类
公有的成员函数可以在类内声明类外定义,也可以在类内直接定义:
class Date
{
public:
void Display(); //类内声明
private:
int _year;
int _month;
int _day;
};
void Date::Display() //类外定义
{
cout << _year << "-" << _month << "-" << _day << endl;
}
如何实例化一个对象?
class Date
{
public:
void Display();
public:
int _year;
int _month;
int _day;
};
int main()
{
Date d1;
d1._year = 2017;
d1._month = 7;
d1._day = 4;
//Date d1;
//Date *date = &d1;
//date->_year = 2017;
//date->_month = 7;
//date->_day = 4;
system("pause");
return 0;
}
1.类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它。
2.一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间存储类成员变量。
一个空类的大小是几?
如果我们sizeof(Date),出来的结果是12;但是如果这个类是空类呢?结果是多少?
class AA {};
int main()
{
int sz = sizeof(AA);
cout << sz << endl;
system("pause");
return 0;
}
输出结果是1!
原因是编译器给空类分配了一个字节的大小用来占位。
注:结构体内存对其规则:
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
gcc中的默认值为4
3.结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
2:类的四个默认成员函数及运算符重载相关知识
构造函数:
成员变量为私有的,要对它们进行初始化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时调用的函数称为构造函数(constructor) 。
构造函数是特殊的成员函数,其特征如下:
1. 函数名与类名相同。
2. 无返回值。
3. 对象构造(对象实例化)时系统自动调用对应的构造函数。
4. 构造函数可以重载。
5. 构造函数可以在类中定义,也可以在类外定义。
6. 如果类定义中没有给出构造函数,则C++编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。
7. 无参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个。
例:我们平时最常用的就是全缺省值的构造函数,定义方式如下:
Date(int year = 1900, int month = 1, int day = 1)
{
_year = year;
_month = month;
_day = day;
}
//在main函数中按照下面方式进行初始化
//若不进行赋值,则采用缺省值为1900-1-1
Date d1(2017, 7, 6)
析构函数:
当一个对象的生命周期结束时,C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数(destructor)
其特征如下:
1. 析构函数在类名加上字符~。
2. 析构函数无参数无返回值。
3. 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。
5. 注意析构函数体内并不是删除对象,而是做一些清理工作。
就好比下面这个例子,构造函数开辟了size个int类型大小的空间,在程序结束时我们就应该释放掉该内存空间,避免发生内存泄漏:
class Array
{
public:
Array(int size)
{
_ptr = new int[size];
}
~Array()
{
if (_ptr)
{
delete[] _ptr;
}
}
private:
int* _ptr;
};
拷贝构造
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数(Copy Constructor),拷贝构造函数是特殊的构造函数。
例:
Date(const Date& d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
//Date d1(2017, 7, 4);
// 下面两种用法都是调用拷贝构造函数,是等价的。
//Date d2(d1);
//Date d2 = d1;
特征
1. 拷贝构造函数其实是一个构造函数的重载。
2. 拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用。
3. 若未显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会,依次拷贝类成员进行初始化。
赋值运算符重载
拷贝构造函数是创建的对象,使用一个已有对象来初始化这个准备创建的对象。赋值运算符的重载是对一个已存在的对象进行拷贝赋值。
5个C++不能重载的运算符: .*/::/sizeof/?:/.
Date& operator = (const Date& d)
{
if (this != &d)//防止重复赋值
{
this->_year = d._year;
this->_month = d._month;
this->_day = d._day;
}
return *this;
}
void Test()
{
Date d1(2017, 7, 4);
//拷贝构造
Date d2(d1);
//赋值运算符重载
Date d3;
d3 = d1;
}
3:关于隐含的this指针以及对运算符重载背后做的事情。
隐含的this指针
1. 每个成员函数都有一个指针形参,它的名字是固定的,称为this指针,this指针是隐式的。(构造函数比较特殊,没有这个隐含this形参)
2. 编译器会对成员函数进行处理,在对象调用成员函数时,对象地址作实参传递给成员函数的第一个形参this指针。
3. this指针是成员函数隐含指针形参,是编译器自己处理的,我们不能在成员函数的形参中添加this指针的参数定义,也不能在调用时显示传递对象的地址给this指针。
例一:在拷贝构造函数中this所做的事情
例二:在运算符重载中this做的事情
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# c
# 运算符重载函数
# 静态成员函数
# 成员函数
# C++运算符重载的方法详细解析
# C++运算符重载规则详解
# c++运算符重载基础知识详解
# c++ *运算符重载
# C++中运算符重载详解及其作用介绍
# 深入解析C++编程中的运算符重载
# 详解C++ 运算符重载中返回值的坑
# C++运算符重载实例代码详解(调试环境 Visual Studio 2019)
# C++ 运算符重载的使用
# 运算符
# 第一个
# 结束时
# 都有
# 值为
# 面向对象
# 整数倍
# 能在
# 要对
# 递归
# 程序设计
# 自动生成
# 量为
# 自己的
# 返回值
# 体内
# 都是
# 是一个
# 也不
# 是一种
相关文章:
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何登录建站主机?访问步骤全解析
如何构建满足综合性能需求的优质建站方案?
广平建站公司哪家专业可靠?如何选择?
盐城做公司网站,江苏电子版退休证办理流程?
如何通过虚拟主机空间快速建站?
html制作网站的步骤有哪些,iapp如何添加网页?
c# await 一个已经完成的Task会发生什么
如何用PHP快速搭建CMS系统?
linux top下的 minerd 木马清除方法
建站org新手必看:2024最新搭建流程与模板选择技巧
如何在Golang中引入测试模块_Golang测试包导入与使用实践
建站之星在线客服如何快速接入解答?
定制建站价位费用解析与套餐推荐全攻略
一键网站制作软件,义乌购一件代发流程?
如何快速搭建高效服务器建站系统?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
如何选择服务器才能高效搭建专属网站?
如何通过虚拟主机快速搭建个人网站?
如何通过宝塔面板实现本地网站访问?
如何设计高效校园网站?
营销式网站制作方案,销售哪个网站招聘效果最好?
定制建站流程解析:需求评估与SEO优化功能开发指南
学校为何禁止电信移动建设网站?
小型网站建站如何选择虚拟主机?
实例解析angularjs的filter过滤器
如何用腾讯建站主机快速创建免费网站?
如何在局域网内绑定自建网站域名?
在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?
如何正确下载安装西数主机建站助手?
5种Android数据存储方式汇总
c# 在高并发下使用反射发射(Reflection.Emit)的性能
开心动漫网站制作软件下载,十分开心动画为何停播?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
网站网页制作专业公司,怎样制作自己的网页?
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
建站VPS配置与SEO优化指南:关键词排名提升策略
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何用5美元大硬盘VPS安全高效搭建个人网站?
如何通过免费商城建站系统源码自定义网站主题与功能?
建站主机空间推荐 高性价比配置与快速部署方案解析
建站之星如何取消后台验证码生成?
简历在线制作网站免费版,如何创建个人简历?
c# 在高并发场景下,委托和接口调用的性能对比
高防服务器如何保障网站安全无虞?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
家具网站制作软件,家具厂怎么跑业务?
英语简历制作免费网站推荐,如何将简历翻译成英文?
*请认真填写需求信息,我们会在24小时内与您取得联系。