C语言到C++ 对象和类的进一步学习2

1.浅拷贝


#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;

class Name
{
public:
	Name(const char *myp)
	{
		len = strlen(myp);
		p = (char*)malloc(len + 1);
		strcpy(p,myp);
	}
	~Name()
	{
		if (p != NULL)
		{
			free(p);
			p = NULL;
			len = 0;
		}
	}


protected:
private:
	char *p;
	int len;
};

void objplaymain()
{
	Name obj0("zhan");
	Name obj1 = obj0; 
	//使用编译器的默认的赋值构造函数
	//只是简单的将成员变量赋值
	//free函数会重复释放同一块的内存 引起错误
	//浅拷贝

	//Name obj2("zhan");
	//obj2 = obj1;	//C++编译器默认的 = 号也是浅拷贝

}

int main06()
{
	objplaymain();  //程序异常


	system("pause");
	return 0;
}

 

2.深拷贝


#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;

class NameA
{
public:
	NameA(const char *myp)
	{
		len = strlen(myp);
		p = (char*)malloc(len + 1);
		strcpy(p, myp);
	}

	//浅拷贝的解决方案 手动编写赋值构造函数 
	//深拷贝
	NameA(const NameA &obj)
	{
		len = obj.len;
		p = (char*)malloc(len + 1);
		strcpy(p, obj.p);
	}

	~NameA()
	{
		if (p != NULL)
		{
			free(p);
			p = NULL;
			len = 0;
		}
	}
protected:
private:
	char *p;
	int len;
};

void objplaymain1()
{
	NameA obj0("zhan");
	NameA obj1 = obj0; 
}

int main07()
{
	objplaymain1();  //程序正常

	system("pause");
	return 0;
}

3.构造函数的初始化列表

 

#include <iostream>

using namespace std;


//构造函数的初始化列表 解决:在B类中组合了一个A类的对象
//根据构造函数的调用规则 设计A的构造函数必须要用
//新的语法规则 Constructor::Constructor():m1(v1),m2(v2),m3(v3)


class A
{
public:
	A(int _a)
	{
		a = _a;
		cout << "构造函数a:" << a << endl;
	}
	~A()
	{
		cout << "析构函数a:" << a << endl;
	}
protected:
private:
	int a;
};

class B
{
public:
	B(int _b):a1(4),a2(6)
	{
		b = _b;
	}
protected:
private:
	int b;	
	A a1;	//定义的顺序
	A a2;
};
//1先执行 被组合对象的构造函数
//如果组合对象有多个 按照定义顺序 而不是按照初始化列表的顺序
//析构函数:和构造函数顺序相反

//2被组合对象的构造顺序和定义的顺序有关系,与初始化列表的顺序没有关系

//在构造中调用构造函数 会产生一个新的匿名对象

int main08()
{
	A a1(5);
	B b1(6);
	
	system("pause");
	return 0;
}

 

4.new和delete的基础语法

#include <iostream>

using namespace std;

// malloc  free   C语言的函数
// new     delete 操作符是C++的语法
//new可以分配 基础类型 分配数组变量 分配类对象

class T
{
public:
	T(int _a)
	{
		a = _a;
		cout << "构造函数执行" << endl;
	}
	~T()
	{
		cout << "析构函数执行" << endl;
	}

private:
	int a;
protected:

};


//分配基础类型  
//malloc/new  delete/free可以混搭
int main91()
{
	//C++ int类型内存 初始化为100
	int *p = new int(100);	
	cout << "p:" << *p << endl;
	delete p;
	p = NULL;

	//C语言
	int *p1 = (int *)malloc(sizeof(int));
	*p1 = 100;
	cout << "p1:" << *p1 << endl;
	free(p1);	//释放	
	p1 = NULL;

	system("pause");
	return 0;
}

//分配数组
//malloc/new  delete/free可以混搭
int main92()
{

	//C语言分配数组
	int *p = (int *)malloc(sizeof(int)*10);
	p[0] = 100;
	cout << "p[0]:" << p[0] << endl;
	free(p);
	p = NULL;

	//C++
	int *p1 = new int[100];
	p1[1] = 102;
	cout << "p1[1]" << p1[1] << endl;
	delete[] p1;
	p1 = NULL;

	system("pause");
	return 0;
}

//分配对象 new delete 
malloc free 不会调用构造/析构函数
//new可以调用构造函数 delete可以调用析构函数
int main09()
{
	//C语言
	T * p = (T*)malloc(sizeof(T));
	free(p);

	//C++
	T *p1 = new T(10);
	//free(p1);
	delete p1;


	system("pause");
	return 0;
}

5.静态成员变量和静态成员函数

#include <iostream>

using namespace std;

//C++类对象中的成员变量和成员函数是分开存储的	
//普通成员变量:存储与对象中,与stuct变量有相同的内存布局和字节对齐方式
//静态成员变量:存储于全局数据区
//成员函数: 存储于代码段
//普通成员函数包含一个指向具体对象的指针,静态成员变量不包含指向具体对象的指针
class Z
{
public:
	void printC()
	{
		cout << "C:" << c << endl;
	}
	void addC()
	{
		c++;
	}

	//静态成员函数,只能调用类的静态成员变量
	//不能使用普通成员变量 
	static void getC() 
	{
		cout << "static getC:" << c << endl;
	}

protected:
private:
	int a;
	int b;
	static int c;  //全部对象共同使用
};

int Z::c = 10;   //设置初始值

int main10()
{
	Z z1, z2, z3;

	z1.printC();
	z2.addC();
	z1.printC();

	//静态成员函数的调用方法
	z3.getC();		//用对象
	Z::getC();		//用类名

	printf("Z:%d",sizeof(Z));
	system("pause");
	return 0;
}

6.this指针

#include <iostream>

using namespace std;

//this是指向自身的指针
class TT
{
public:
	TT(int a,int b)
	{
		this->a = a;
		this->b = b;
	}
	void printT()
	{
		cout << "a:" << a << endl;
		cout << "b:" << this->b << endl;
	}
private:
	int a;
	int b;

protected:
};

int main()
{
	TT t1(5,6);
	t1.printT();

	system("pause");
	return 0;
}

 

【基于Python的大麦网自动抢票工具的设计与实现】 随着互联网技术的发展,网络购票已经成为人们生活中不可或缺的一部分。尤其是在文化娱乐领域,如音乐会、演唱会、戏剧等活动中,热门演出的门票往往在开售后瞬间就被抢购一空。为了解决这个问题,本论文探讨了一种基于Python的自动抢票工具的设计与实现,旨在提高购票的成功率,减轻用户手动抢票的压力。 Python作为一种高级编程语言,因其简洁明了的语法和丰富的第三方库,成为了开发自动化工具的理想选择。Python的特性使得开发过程高效且易于维护。本论文深入介绍了Python语言的基础知识,包括数据型、控制结构、函数以及模块化编程思想,这些都是构建抢票工具的基础。 自动化工具在现代社会中广泛应用,尤其在网络爬虫、自动化测试等领域。在抢票工具的设计中,主要利用了自动化工具的模拟用户行为、数据解析和定时任务等功能。本论文详细阐述了如何使用Python中的Selenium库来模拟浏览器操作,通过识别网页元素、触发事件,实现对大麦网购票流程的自动化控制。同时,还讨论了BeautifulSoup和requests库在抓取和解析网页数据中的应用。 大麦网作为国内知名的票务平台,其网站结构和购票流程对于抢票工具的实现至关重要。论文中介绍了大麦网的基本情况,包括其业务模式、用户界面特点以及购票流程,为工具的设计提供了实际背景。 在系统需求分析部分,功能需求主要集中在自动登录、监控余票、自动下单和异常处理等方面。抢票工具需要能够自动填充用户信息,实时监控目标演出的票务状态,并在有票时立即下单。此外,为了应对可能出现的网络延迟或服务器错误,工具还需要具备一定的错误恢复能力。性能需求则关注工具的响应速度和稳定性,要求在大量用户同时使用时仍能保持高效运行。 在系统设计阶段,论文详细描述了整体架构,包括前端用户界面、后端逻辑处理以及与大麦网交互的部分。在实现过程中,采用了多线程技术以提高并发性,确保在抢票关键环节的快速响应。此外,还引入了异常处理机制,以应对网络故障或程序错误。 测试与优化是确保抢票工具质量的关键步骤。论文中提到了不同场景下的测试策略,如压力测试、功能测试和性能测试,以验证工具的有效性和稳定性。同时,通过对抢票算法的不断优化,提高工具的成功率。 论文讨论了该工具可能带来的社会影响,包括对消费者体验的改善、对黄牛现象的抑制以及可能引发的公平性问题。此外,还提出了未来的研究方向,如增加多平台支持、优化抢票策略以及考虑云服务的集成,以进一步提升抢票工具的实用性。 本论文全面介绍了基于Python的大麦网自动抢票工具的设计与实现,从理论到实践,从需求分析到系统优化,为读者提供了一个完整的开发案例,对于学习Python编程、自动化工具设计以及理解网络购票市场的运作具有重要的参考价值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值