当前位置: 首页 > news >正文

大航母网站建设案例网站开发有哪些服务

大航母网站建设案例,网站开发有哪些服务,计算机做网站开题报告,深圳app开发红孩儿文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点: 四、拷贝构造4.1、引入4.2、特征:4.3、默认拷贝构造函数 总结 前言 在本节中&a…

文章目录

  • 前言
  • 一、this指针
    • 1.1、this指针的引出
    • 1.2、 this指针的特性
  • 二、类的默认的六个构造函数
    • 2.1、构造函数简述
    • 2.2构造函数
  • 三、析构函数
    • 3.1、析构函数引出
    • 3.2、特点:
  • 四、拷贝构造
    • 4.1、引入
    • 4.2、特征:
    • 4.3、默认拷贝构造函数
  • 总结


前言

在本节中,我将给大家介绍我们在学习C++中经常要用到的,this指针、类的六个默认成员函数、运算符重载等相关知识.

下面我会结合一个简单的类----日期类来介绍

后面需要时会补充相应的成员函数

class Date
{
public:void Display()//打印类对象中的内容{cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};

一、this指针

1.1、this指针的引出

int main(){Date d1, d2;d1.SetDate(2024,5,1);d2.SetDate(2024,6,1);d1.Display();d2.Display();return 0;}

当执行上述代码时,它的输出结果为:
在这里插入图片描述
下面的汇编不了解的,可以搜一下栈帧的创建和销毁,对今后的学习帮助很大
在这里插入图片描述

通过汇编我们可以看到,两次调用的SetDat函数地址相同(调用同一函数)

对于上述类,有这样的一个问题:
Date类中有SetDate与Display两个成员函数,函数体中没有关于不同对象的区分,那当d1调用SetDate函数时,该函数是如何知道应该设置s1对象,而不是设置d2对象呢?

C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

1.2、 this指针的特性

  1. this指针只能在“成员函数”的内部使用
  2. this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。
  3. this指针是成员函数第一个隐含的指针形参,不需要用户
    传递.

将调用成员函数展开:
在这里插入图片描述

下面我们来证明一下this指针,本质上就是对象的地址:

为了更清晰的展示,我会简化用不到的代码

class Date
{
public:void Print_this(){cout << this << endl;//打印this指针}
private:int _year; // 年int _month; // 月int _day; // 日
};
int main()
{Date d1, d2;d1.Print_this();//cout << &d1 << endl;//如果和我们说的一样,那么打印结果应该两两相同d2.Print_this();cout << &d2 << endl;return 0;
}

结果:
在这里插入图片描述
可以看到this本质就是对象的地址。这就是隐藏的this指针,当然我们可以像学习C语言时知道一个结构体对象的地址使用“->”来进行成员变量的访问

class Date{public:void Display(){cout <<this-> _year << "-" <<this-> _month << "-" << this->_day << endl;}private:int _year; // 年int _month; // 月int _day; // 日};

二、类的默认的六个构造函数

在这里插入图片描述

恩师莫怪

2.1、构造函数简述

如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,编译器都会自动生成6个默认成员函数。这些函数叫做构造函数。构造函数的任务是初始化类对象的数据成员,无论何时只要类的对象被创建,就会执行构造函数。
构造函数特点:

1.构造函数的名字和类名相同。
2.和其他函数不一样的是,构造函数没有返回类型。
3.类似于其他的函数,构造函数也有一个(可能为空的)参数列表和一个(可能为空的)函数体。
4.构造函数不能被声明成const 的。

需要特别注意的是,一个类可以拥有多个参数不同的构造函数,这些构造函数之间,向普通函数之间一样,可以构成函数重载

2.2构造函数

再贴一遍方便大家看

class Date
{
public:void Display()//打印类对象中的内容{cout << _year << "-" << _month << "-" << _day << endl;}void SetDate(int year, int month, int day){_year = year;_month = month;_day = day;}
private:int _year; // 年int _month; // 月int _day; // 日
};

对于Date类,可以通过SetDate公有的方法给对象设置内容,但是如果每次创建对象都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?我们上面说过:创建类的类型对象时由编译器自动调构造函数,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。

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(2024, 6, 1); // 调用带参的构造函数,用于初始化// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明// 以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象Date d3();

如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
1.证明编译器默认生成的为无参的构造函数:

在这里插入图片描述

可以看到,我将自己写的构造函数屏蔽后,调用有参的构造函数是无法成功的,无参的并没有报错,这也说明编译器默认生成的为无参的构造函数。
2.证明当我们显示写出一个构造函数,编译器就不会在生成默认的构造函数:
在这里插入图片描述

我将带参的构造函数显示定义,d1无法调用无参的默认构造函数。
无参的构造函数和全缺省的构造函数都称为默认构造函数,并且这两个默认构造函数不能同时存在。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数.

默认构造函数我们一般是为了处理自定义类型的成员变量

三、析构函数

3.1、析构函数引出

前面通过构造函数的学习,我们知道一个对象时怎么来的,那一个对象又是怎么没呢的?
析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作(比如:类中定义的指针指向的空间的清理)

3.2、特点:

  1. 析构函数名是在类名前加上字符 ’~‘。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数
![class Date
{
public:~Date(){_year = 0;_month = 0;_day = 0;} Date(int year, int month, int day){_year = year;_month = month;_day = day;}int _year;int _month;int _day;
};
int main()
{Date d2(2024, 6, 1);return 0;
}

反汇编视角:
在这里插入图片描述

在上面的代码中,我并没有去显示调用析构函数,但是在程序执行结束时,编译器自动调用了,析构函数
这个也可以像构造函数一样测试,大家尝试一下

四、拷贝构造

4.1、引入

拷贝构造函数是构造函数的一种重载形式,它可以用来创建一个与已存在的对象一模一样的新对象。对于拷贝构造,它只有单个形参,且该形参必须是对本类类型对象的引用,因为要引用,所以要加const修饰。

4.2、特征:

1.拷贝构造函数的参数若使用传值方式编译器直接报错, 因为会引发无穷递归调用
2.若未显式定义,编译器会生成默认的拷贝构造函数。 默认的拷贝构造函数,对对象按 字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝。
3.编译器生成的默认拷贝构造函数已经可以完成字节序的值拷贝了。

class Date
{
public:Date(int year = 1900, int month = 1, int day = 1)//全缺省{_year = year;_month = month;_day = day;}// Date(const Date d)   // 错误--引发无穷递归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);//也可以写成Date d2=d1return 0;
}

4.3、默认拷贝构造函数

像上面介绍的默认成员函数一样,当我们没有在类中写拷贝构造函数时,编译器会自动生成一个默认的拷贝构造。

系统生成的拷贝构造也会针对成员变量的内置类型和自定义类型做一个区分。对于内置类型的成员变量,编译器会按照被拷贝对象的内存存储字节序完成拷贝,就好比被拷贝的对象有3个int类型成员变量,占12字节内存,编译器会根据该对象的内存和成员初始值拷贝给新对象。

总结

本次我们介绍了,this指针、构造函数、析构函数、拷贝构造、等一些与类紧密关联的知识。
要将他们详细的介绍,所用篇幅过长,后续会出拓展版的

http://www.yayakq.cn/news/737909/

相关文章:

  • 纳税服务网站建设情况自学织梦做网站要多久
  • 怎么建视频网站免费的怎么做一个赚钱得网站
  • 网站的网络推广策略有哪些编程网页
  • 网站开发下载那个部分网页打不开
  • 网站开发外包合同模板群晖可以做网站吗
  • 好点子网站建设网站开发与制作工资
  • 快站app制作教程软件工程师就业前景
  • 巨鹿网站建设设计做品牌特价的网站
  • html网页设计网站开发报告wordpress授权插件
  • 1 高端品牌网站定制wordpress单页面制作
  • 网站建设图片设置江西建设信息网站
  • 网站百度搜索第一页qq小程序打不开怎么办
  • 石家庄网站建设与推广宣传册设计样本
  • 手机网站 软件北京知名网站推广
  • 成都网站建设易维达好网站建设应该考虑哪些问题
  • 差异基因做聚类分析网站软文的本质是什么
  • 哈尔滨seo网站管理企业网络的构建与实施
  • dw做网站学习解析导购网站开发 源码
  • 外贸建站 知乎有域名怎么做公司网站
  • 陕西交通建设集团西商分公司网站免费空间服务器
  • 什么网站可以免费做宣传哪有专做注册小网站的
  • 为什么做不了自己的网站style wordpress
  • 浙江网站制作公司泰安百度推广代理
  • cloud域名注册网站ps制作网站效果图
  • 建设局网站瓯龙建州府3号楼wordpress js合并
  • 网站建设项目报告书云龙主机 wordpress
  • 网站制作网站建设运营团队做网站 成都
  • 永济网站建设做网站有必要做app吗
  • dart 网站开发食品网站首页模板欣赏
  • 做传奇网站wordpress博客安卓