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

360网站卖东西怎么做的网络营销和传统营销的区别和联系

360网站卖东西怎么做的,网络营销和传统营销的区别和联系,做公益网站需要哪些部门认证,宁波市网站建设文章目录 一、拷贝构造函数1、定义2、特点3、如何使用 二、运算符重载1、定义2、特点3、使用 三、感谢观看! 一、拷贝构造函数 1、定义 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝…

文章目录

  • 一、拷贝构造函数
    • 1、定义
    • 2、特点
    • 3、如何使用
  • 二、运算符重载
    • 1、定义
    • 2、特点
    • 3、使用
  • 三、感谢观看!

一、拷贝构造函数

1、定义

如果一个构造函数的第一个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是一个特殊的构造函数。

拷贝构造函数的作用和构造函数相同,均是将对象初始化化,区别是拷贝构造函数是拷贝一个对象来初始化另一个对象!
仍然用一个日期类来讲解:

#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class jyan
{
private:int _year;int _month;int _day;
public://全缺省构造函数jyan(int year=1,int month=1,int day=1){_year = year;_month = month;_day = day;}void print(){cout << _year << "/" << _month << "/" << _day << endl;}
};int main()
{//构造函数jyan aa(2025,3,26);aa.print();//拷贝构造jyan bb(aa);  //拷贝一个对象来初始化我自己bb.print();return 0;
}

在这里插入图片描述
日期类不用写拷贝构造,会自动拷贝。

//显式定义拷贝构造函数
jyan(const jyan& b)  //加const用来保护形参不被改变
{_year = b._year;_month = b._month;_day = b._day;
}

2、特点

拷贝函数的特点

  • 拷贝构造函数是构造函数的一个重载。
  • 拷贝构造函数的第一个参数必须是类类型对象的引用,使用传值方式编译器直接报错,因为语法逻辑上会引发无穷递归调用。
  • C++规定自定义类型对象进行拷贝行为必须调用拷贝构造,所以这里自定义类型传值传参和传值返回都会调用拷贝构造完成。
  • 若未显式定义拷贝构造,编译器会生成自动生成拷贝构造函数。自动生成的拷贝构造对内置类型成员变量会完成值拷贝/浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用它的拷贝构造。
  • 如果一个类显示实现了析构并释放资源,那么它就需要显示写拷贝构造,否则就不需要。
  • C++规定,传值传参要构造拷贝构造!所以自定义类型传参最好要使用引用传参

3、如何使用

我们根据拷贝构造的特点,就已经知道自动生成的拷贝构造对内置类型的成员变量完成浅拷贝(一个字节一个字节的拷贝),对自定义类型成员变量会调用它的拷贝构造。
如果一个类显示实现了析构并释放资源,那么它就需要显示写拷贝构造,否则就不需要。
以下段栈类为例:

typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;} 显示实现拷贝构造 st2(st1)//Stack(const Stack& st)//{//	cout << "Stack(const Stack& st)" << endl;//	// 需要对_a指向资源创建同样大的资源再拷贝值//	_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);//	if (nullptr == _a)//	{//		perror("malloc申请空间失败!!!");//		return;//	}//	memcpy(_a, st._a, sizeof(STDataType) * st._top);//	_top = st._top;//	_capacity = st._capacity;//}void Push(STDataType x){if (_top == _capacity){int newcapacity = _capacity * 2;STDataType* tmp = (STDataType*)realloc(_a, newcapacity *sizeof(STDataType));if (tmp == NULL){perror("realloc fail");return;}_a = tmp;_capacity = newcapacity;}_a[_top++] = x;}//析构~Stack(){cout << "~Stack()" << endl;free(_a);_a = nullptr;_top = _capacity = 0;}
private:STDataType* _a;size_t _capacity;size_t _top;
};int main()
{Stack st1;st1.Push(1);st1.Push(2);// Stack不显示实现拷贝构造,用自动生成的拷贝构造完成浅拷贝// 会导致st1和st2里面的_a指针指向同一块资源,析构时会析构两次,程序崩溃Stack st2(st1);return 0;
}

当未显示实现拷贝构造时(注释掉的函数),程序崩溃:
在这里插入图片描述
由上图可见,终端中打印了两次“~Stack()”,说明在上段程序中,栈类析构了两次。
原因分析:
浅拷贝
在这里插入图片描述
所以,这种情况就是自动生成的拷贝构造不适合,我们需要自己写一个适用的:

// 显示实现拷贝构造 st2(st1)
Stack(const Stack& st)
{cout << "Stack(const Stack& st)" << endl;// 需要对_a指向资源创建同样大的资源再拷贝值_a = (STDataType*)malloc(sizeof(STDataType) * st._capacity);if (nullptr == _a){perror("malloc申请空间失败!!!");return;}memcpy(_a, st._a, sizeof(STDataType) * st._top);_top = st._top;_capacity = st._capacity;
}

深拷贝
在这里插入图片描述
此时,st1与st2中_a的地址就不同了,程序正常运行!

二、运算符重载

1、定义

像一些内置类型,如int、float、char等,定义的变量进行加减乘除、比较大小等操作时,我们直接用符号相接是直接支持的,但当我们想要对自定义类型来操作时,想要达到同样的运算操作,就需要进行运算符重载!
运算符重载是具有特名字的函数,他的名字是由operator和后面要定义的运算符共同构成。和其他函数一样,它也具有其返回类型和参数列表以及函数体。重载运算符函数的参数个数和该运算符作用的运算对象数量一样多。一元运算符有一个参数,二元运算符有两个参数,二元运算符的左侧运算对象传给第一个参数,右侧运算对象传给第二个参数。

2、特点

  • 当运算符被用于类类型的对象时,C++允许我们通过运算符重载的形式指定新的含义。
  • C++规定类类型对象使用运算符时,必须转换成调用对应运算符重载,若没有对应的运算符重载,则会编译报错。
  • 如果一个重载运算符函数是成员函数,则它的第一个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数比运算对象少一个。
  • 运算符重载以后,其优先级和结合性与对应的内置类型运算符保持一致。不能通过连接语法中没有的符号来创建新的操作符:比如operator@。
  • 注意以下5个运算符不能重载:
    -在这里插入图片描述
  • 重载操作符至少有一个类类型参数不能通过运算符重载改变内置类型对象的含义,如:intoperator+(int x,int y)
  • 一个类需要重载哪些运算符,是看哪些运算符重载后有意义,比如jyan类中重载operator-就有意但是重载operator+就没有意义。

3、使用

对上面的日期类进行比较大小:

#include <iostream>
using namespace std;
class jyan
{
public:int _year;int _month;int _day;
public://全缺省构造函数jyan(int year=1,int month=1,int day=1){_year = year;_month = month;_day = day;}void print(){cout << _year << "/" << _month << "/" << _day << endl;}
};
bool operator==(const jyan& x, const jyan& y)
{if (x._year == y._year && x._month == y._month && x._day == y._day)return true;elsereturn false;
}
int main()
{//构造函数jyan aa(2025, 3, 26);aa.print();//拷贝构造jyan bb(aa);  //拷贝一个对象来初始化我自己bb.print();//判断aa、bb是否相等cout << (aa == bb);//aa==bb,还可以写为:operator==(aa,bb);return 0;
}

在这里插入图片描述

在这里插入图片描述

注:上面我为了能够在类外访问_year, _month, _day,而将这几个变量改为了public,这种方法对程序来说是很危险的,最好重载为成员函数。

成员函数的写法

#include <iostream>
using namespace std;
class jyan
{
private:int _year;int _month;int _day;
public://全缺省构造函数jyan(int year=1,int month=1,int day=1){_year = year;_month = month;_day = day;}bool operator==(const jyan& y){if (_year == y._year && _month == y._month && _day == y._day)return true;elsereturn false;}void print(){cout << _year << "/" << _month << "/" << _day << endl;}
};int main()
{//构造函数jyan aa(2025, 3, 26);aa.print();//拷贝构造jyan bb(aa);  //拷贝一个对象来初始化我自己bb.print();//判断aa、bb是否相等cout << (aa == bb);return 0;
}

这里就要注意成员函数的特点,如果一个重载运算符函数是成员函数,则它的第一个运算对象默认传给隐式的this指针,因此运算符重载作为成员函数时,参数比运算对象少一个。
故:我们形参列表只写了y
在这里插入图片描述

三、感谢观看!

http://www.dtcms.com/wzjs/360582.html

相关文章:

  • 做动态网站用什么语言劳动局免费培训项目
  • 做公众号的网站有哪些功能seo网络优化日常工作内容
  • 合肥网站定制开发公司seo网站排名优化服务
  • 党建网站建设问题电商网页制作教程
  • 免费建站小程序百度推广托管
  • 合优网站建设最佳的资源磁力搜索引擎
  • 做男装比较好的网站外包公司为什么没人去
  • 网页设计毕业论文总结800字seo软文代写
  • 网站建设用阿里云的虚拟主机百度扫一扫
  • 长沙网站搜索引擎优化网站关键词优化报价
  • 成都市建设厅网站平台网站开发公司
  • 如何接做网站编程的生意千万别手贱在百度上搜这些词
  • 做垃圾网站怎么赚钱网络营销活动案例
  • 青海门户网站建设小型项目外包网站
  • 网站建设推广公司排名广州市新闻发布
  • 临朐网站建设哪家好网络营销价格策略有哪些
  • 做娃衣的布料去哪个网站网络营销的特点
  • 推荐好的设计网站win7优化大师好不好
  • 如何在yy做电影网站百度搜索下载安装
  • seo网站推广教程成都网站排名 生客seo
  • 上海龙象建设集团公司网站软文写作服务
  • 网站登录如何做怎样在百度发广告贴
  • 免费网站看v片在线第一次做seo优化工具推荐
  • 网络营销推广的方式和特点seo查询官网
  • 无做a视频网站搜索关键词推荐
  • c蔡甸区城乡建设局网站今天刚刚发生的新闻
  • 所以免费爱做网站厦门网站外包
  • 河南省住房和城乡建设厅网站确认书微信营销系统
  • 我想帮别人做网站有这样的平台吗深圳最新通告今天
  • 做视频网站多少钱杭州企业seo