指针权限,new与delete,类与对象,函数模板,类模板的用法

这篇具有很好参考价值的文章主要介绍了指针权限,new与delete,类与对象,函数模板,类模板的用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

指针权限 用法

void Print(const char* SecretPointer)
{
	cout << "绝密指令为:";
	cout << SecretPointer << endl;
}

void Change(int& number, int* const FixedPointer)
{
	cout << "更换站台数字为:";
	cin >> number;
	cout << *FixedPointer << endl;
}

int main()
{
	char* SecretPointer_01 = (char*)malloc(sizeof(char) * 20);
	cout << "请输入绝密指令:";
	cin >> SecretPointer_01;
	const char* SecretPointer = SecretPointer_01;
	Print(SecretPointer);

	int number = 100;
	int* const FixedPointer = &number;
	cout << "原站台数字为:" << *FixedPointer << endl;
	Change(number, FixedPointer);

	return 0;
}

new与delete 用法

#include <iostream>
using namespace std;

int* CreateSpace1(int*&  PointerOfSum1)
{
	PointerOfSum1 = new int(0);     // 1 
	return new int[5]{ 1,2,3,4,5 };     //  2
}

void AddArray1(int*& PointerOfSum1, int*& PointerOfArray1)
{
	for (int i = 0; i < 5; i++)
	{
		(*PointerOfSum1) += (*(PointerOfArray1 + i));
	}
}

// 

class StupidPerson
{
public:
	StupidPerson(int IQ = 10)
		:_IQ(IQ)
	{}
	int GetIQ()
	{
		return _IQ;
	}
private:
	int _IQ;
};

StupidPerson* CreateSpace2(int*& PointerOfSum2)
{
	PointerOfSum2 = new int(0);
	return new StupidPerson[5];    // 3
}

void AddArray2(int*& PointerOfSum2, StupidPerson*& PointerOfArray2)
{
	for (int i = 0; i < 5; i++)
	{
		(*PointerOfSum2) += ((*(PointerOfArray2 + i)).GetIQ());
	}
}

//

class SmartPerson
{
public:
	SmartPerson(int IQ = 100)
		:_IQ(IQ)
	{}
	~SmartPerson()
	{
		_IQ = 0;
	}
	int GetIQ()
	{
		return _IQ;
	}
private:
	int _IQ;
};

SmartPerson* CreateSpace3(int*& PointerOfSum3)
{
	PointerOfSum3 = new int(0);
	return new SmartPerson[5]{ SmartPerson(),SmartPerson(101),SmartPerson(102) ,SmartPerson(99) ,SmartPerson(107) };   // 4
}

void AddArray3(int*& PointerOfSum3, SmartPerson*& PointerOfArray3)
{
	for (int i = 0; i < 5; i++)
	{
		(*PointerOfSum3) += ((*(PointerOfArray3 + i)).GetIQ());
	}
}

int main()
{
	int* PointerOfSum1 = nullptr;
	int* PointerOfArray1 = CreateSpace1(PointerOfSum1);
	AddArray1(PointerOfSum1, PointerOfArray1);
	cout << "总和为:" << (*PointerOfSum1) << endl;
	delete PointerOfSum1;   // 5
	delete[] PointerOfArray1;    //  6
	//
	int* PointerOfSum2 = nullptr;
	StupidPerson* PointerOfArray2 = CreateSpace2(PointerOfSum2);
	AddArray2(PointerOfSum2, PointerOfArray2);
	cout << "IQ总和为:" << (*PointerOfSum2) << endl;
	delete PointerOfSum2;
	delete[] PointerOfArray2;
	//
	int* PointerOfSum3 = nullptr;
	SmartPerson* PointerOfArray3 = CreateSpace3(PointerOfSum3);
	AddArray3(PointerOfSum3, PointerOfArray3);
	cout << "IQ总和为:" << (*PointerOfSum3) << endl;
	delete PointerOfSum3;
	delete[] PointerOfArray3;
	//
	SmartPerson* ps = (SmartPerson*)malloc(sizeof(SmartPerson) * 10);
	cout << "内存池已经创建完成!" << endl;
	new(ps)SmartPerson(110);    //  7
	new(ps + 1)SmartPerson(103);
	cout << "第一个人智商为:" << ps->GetIQ() << endl;
	cout << "第二个人智商为:" << (ps + 1)->GetIQ() << endl;
	ps->~SmartPerson();   // 8
	(ps + 1)->~SmartPerson();
	return 0;
}

类与对象 用法

test.h

#include <iostream>
using namespace std;

class Country
{
	friend class Citizen;
	friend istream& operator>>(istream& cin, Country& country);
	friend ostream& operator<<(ostream& cout, const Country& country);
public:
	//构造函数
	Country();
	//拷贝构造函数
	Country(const Country& other);
	//析构函数
	~Country();
	//赋值运算符重载
	Country& operator=(const Country& other);
private:
	char* _countryname;
	char* _capital;
};
//流插入运算符重载
istream& operator>>(istream& cin, Country& country);
//流提取运算符重载
ostream& operator<<(ostream& cout, const Country& country);

//

class Citizen
{
	friend int operator>(const Citizen& c1, const Citizen& c2);
	friend istream& operator>>(istream& cin, Citizen& citizen);
	friend ostream& operator<<(ostream& cout, const Citizen& citizen);
public:
	//构造函数
	explicit Citizen(bool iscriminal = false);
	//拷贝构造函数
	Citizen(const Citizen& other);
	//析构函数
	~Citizen();
	//赋值运算符重载
	Citizen& operator=(const Citizen& other);
	//前置++运算符重载
	Citizen& operator++();
	//后置++运算符重载
	Citizen operator++(int);
	//普通运算符重载
	Citizen& operator-(int num);
	//静态成员函数
	static int GetTotalCitizen();
	//友元类的跨类访问
	void GetCountry();
private:
	//成员变量
	char* _personalname;
	int _age;
	Country _nationality;
	bool _iscriminal;
	int _creditscore;
	const int _maxcreditscore;
	//类的静态区成员变量
	static int _totalcitizen;
};
//普通运算符重载
int operator>(const Citizen& c1, const Citizen& c2);
//流插入运算符重载
istream& operator>>(istream& cin, Citizen& citizen);
//流提取运算符重载
ostream& operator<<(ostream& cout, const Citizen& citizen);
//func.cpp

#include "test.h"

//Country类相关
Country::Country()
{
	_countryname = new char[20]{ '\0' };
	_capital = new char[20]{ '\0' };
}

Country::Country(const Country& other)
{
	_countryname = new char[20]{ '\0' };
	_capital = new char[20]{ '\0' };
	memcpy(_countryname, other._countryname, sizeof(char) * 20);
	memcpy(_capital, other._capital, sizeof(char) * 20);
}

Country::~Country()
{
	delete[] _countryname;
	delete[] _capital;
}

Country& Country::operator=(const Country& other)
{
	if (&other != this)
	{
		memcpy(_countryname, other._countryname, sizeof(char) * 20);
		memcpy(_capital, other._capital, sizeof(char) * 20);
	}
	return *this;
}

istream& operator>>(istream& cin, Country& country)
{
	cin >> country._countryname >> country._capital;
	return cin;
}

ostream& operator<<(ostream& cout, const Country& country)
{
	cout << country._countryname << " " << country._capital;
	return cout;
}


//Citizen类相关
Citizen::Citizen(bool iscriminal)
	:_age(0)
	,_nationality()
	,_iscriminal(iscriminal)
	,_creditscore(0)
	,_maxcreditscore(100)
{
	_personalname = new char[20]{ '\0' };
	_totalcitizen++;
}

Citizen::Citizen(const Citizen& other)
	:_age(other._age)
	, _nationality(other._nationality)
	, _iscriminal(other._iscriminal)
	, _creditscore(other._creditscore)
	, _maxcreditscore(other._maxcreditscore)
{
	_personalname = new char[20]{ '\0' };
	memcpy(_personalname, other._personalname, sizeof(char) * 20);
	_totalcitizen++;
}

Citizen::~Citizen()
{
	delete[] _personalname;
	_totalcitizen--;
}

Citizen& Citizen::operator=(const Citizen& other)
{
	if (&other != this)
	{
		_age = other._age;
		_nationality = other._nationality;
		_iscriminal = other._iscriminal;
		_creditscore = other._creditscore;
		memcpy(_personalname, other._personalname, sizeof(char) * 20);
	}
	return *this;
}

Citizen& Citizen::operator++()
{
	if (_creditscore < _maxcreditscore)
	{
		_creditscore++;
	}
	return *this;
}

Citizen Citizen::operator++(int)
{
	Citizen tmp(*this);
	if (_creditscore < _maxcreditscore)
	{
		_creditscore++;
	}
	return tmp;
}

Citizen& Citizen::operator-(int num)
{
	if (_creditscore > 0)
	{
		_creditscore -= num;
		if (_creditscore < 0)
		{
			_creditscore = 0;
		}
	}
	return *this;
}

int operator>(const Citizen& c1, const Citizen& c2)
{
	if (c1._creditscore > c2._creditscore)
	{
		return 1;
	}
	else if (c1._creditscore < c2._creditscore)
	{
		return 2;
	}
	else
	{
		return 0;
	}
}

istream& operator>>(istream& cin, Citizen& citizen)
{
	cin >> citizen._personalname >> citizen._age >> citizen._nationality
		>> citizen._iscriminal >> citizen._creditscore;
	return cin;
}

ostream& operator<<(ostream& cout, const Citizen& citizen)
{
	cout << citizen._personalname << " " << citizen._age << " " << citizen._nationality
		<< " " << citizen._iscriminal << " " << citizen._creditscore;
	return cout;
}

int Citizen::GetTotalCitizen()
{
	return _totalcitizen;
}

void Citizen::GetCountry()
{
	cout << _nationality._countryname << " " << _nationality._capital << endl;
}

//类的静态区成员变量定义
int Citizen::_totalcitizen = 0;
//test.cpp

#include "test.h"

int main()
{
	Citizen Shen(0);
	cin >> Shen;
	cout << Shen << endl;

	Citizen Jun(Shen);
	cout << Jun << endl;

	Citizen Elon(0);
	cin >> Elon;
	cout << Elon << endl;

	cout << "此时人数:" << Citizen::GetTotalCitizen() << endl;
	return 0;
}

函数模板 用法

// test.h

#include <iostream>
using namespace std;

template <typename T>
void Swap(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

template <typename T1, typename T2, typename T3>
void Print(const T1& a, const T2& b, const T3& c)
{
	cout << a << " " << b << " " << c << endl;
}
// test.cpp
#include "test.h"

int main()
{
	int x = 1;
	int y = 2;
	char m = 'x';
	char n = 'y';
	cout << "交换前:" << endl;
	cout << x << " " << y << endl;
	cout << m << " " << n << endl;
	Swap(x, y);
	Swap(m, n);
	cout << "交换后:" << endl;
	cout << x << " " << y << endl;
	cout << m << " " << n << endl;
	//
	const char* pointer = "根据ASCII码表对应的(值/字符)为";
	char obj1 = 'A';
	int obj2 = 65;
	Print(obj1, pointer, obj2);
	Print<int, const char*, char>(obj1, pointer, obj2);     
	return 0;
}

类模板 用法

// test.h
#include <iostream>
using namespace std;

template <typename T>
class Person
{
	friend istream& operator>>(istream& cin, Person<T>& person)
	{
		cin >> person._name >> *(person._luckysymbol);
		return cin;
	}
	friend ostream& operator<<(ostream& cout, Person<T>& person)
	{
		cout << person._name << " " << *(person._luckysymbol);
		return cout;
	}
public:
	Person();
	Person(const Person& other);
	~Person();
	Person& operator=(const Person& other);
private:
	char* _name;
	T* _luckysymbol;
};


template <typename T>
Person<T>::Person()
{
	_name = new char[20]{ 0 };
	_luckysymbol = new T(0);
}

template <typename T>
Person<T>::Person(const Person& other)
	:_name(new char[20]{ 0 })
	, _luckysymbol(new T(0))
{
	memcpy(_name, other._name, sizeof(char) * 20);
	*_luckysymbol = *(other._luckysymbol);
}

template <typename T>
Person<T>::~Person()
{
	delete _luckysymbol;
	delete[] _name;
}

template <typename T>
Person<T>& Person<T>::operator=(const Person& other)
{
	if (&other != this)
	{
		memcpy(_name, other._name, sizeof(char) * 20);
		*_luckysymbol = *(other._luckysymbol);
	}
	return  *this;
}
// test.cpp
#include "test.h"

int main()
{
	Person<int> Shen;
	Person<char> Hu;
	Person<double> Ye;
	cin >> Shen >> Hu >> Ye;
	Person<int> Junyang(Shen);  
	Person<char> Yao;   
	Yao = Hu;   
	cout << Shen << endl;
	cout << Hu << endl;
	cout << Ye << endl;
	cout << Junyang << endl;
	cout << Yao << endl;
	return 0;
}

文章来源地址https://www.toymoban.com/news/detail-709245.html

到了这里,关于指针权限,new与delete,类与对象,函数模板,类模板的用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 进一步了解C++函数的各种参数以及重载,了解C++部分的内存模型,C++独特的引用方式,巧妙替换指针,初步了解类与对象。满满的知识,希望大家能多多支持

    C++的编程精华,走过路过千万不要错过啊!废话少说,我们直接进入正题!!!! 函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的。 语法 : 返回值类型 函数名 (参数 = 默认值){} 示例 : 函数占位参数 C++中函数的形参列表里可以有占位参教,用来做占位

    2023年04月17日
    浏览(55)
  • 侯捷 C++ part2 兼谈对象模型笔记——7 reference、const、new/delete

    7.1 reference x 是整数,占4字节; p 是指针占4字节(32位); r 代表 x ,那么 r 也是整数 ,占4字节 引用与指针不同,只能代表一个变量,不能改变 引用底部的实现也是指针,但是注意 object 和它的 reference 的 大小是相同的,地址也是相同的 (是编译器制造的假象) reference 通

    2024年02月12日
    浏览(32)
  • C++(20):constexpr函数中可以成对的使用new/delete

    C++20前,constexpr函数中是不能使用new和delete的。 C++20进一步的放宽了限制,允许成对的使用new和delete。

    2024年02月08日
    浏览(37)
  • 重复delete 对象指针后的 异常调用栈怪异 解析

    Release版VC6 MFC程序 程序正常退出时得到一个如下异常调用栈: 顶层两个函数调用帧都是错的,地址怪异 ,没有函数名子通过反汇编校验,根据帧返回地址是 0079451a 判断出具体函数源码位置, 不及格的程序员-八神 在内存窗口中查看此变量周围已经被16进制 feee feee填充,看我

    2023年04月19日
    浏览(25)
  • 【C++】类与对象【定义、访问限定符、this指针】

      🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: http://t.csdnimg.cn/eCa5z   目录 面向过程和面向对象初步认识  类的引入 类的定义 成员变量命名规则的建议: 类的访问限定符及封装 访问限定符  封装 类的实例化 类对象模型 类对象的存储方式 计

    2024年02月21日
    浏览(45)
  • 【C++初阶】七、内存管理(C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表达式)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】六、类和对象(初始化列表、static成员、友元、内部类)-CSDN博客  ==================

    2024年02月05日
    浏览(44)
  • 【是C++,不是C艹】 类与对象 | 认识面向对象 | 访问限定符 | 封装 | this指针

    💞💞 欢迎来到 Claffic 的博客 💞💞  👉  专栏: 《是C++,不是C艹》👈 前言: 在C++入门之后,就要进入C++的第一个核心:类与对象,这期带大家认识认识面向对象编程,访问限定符,封装以及 this 指针。 注: 你最好是学完了C语言,并学过一些初阶的数据结构。 (没有目

    2024年02月07日
    浏览(44)
  • C++初阶类与对象(一):学习类与对象、访问限定符、封装、this指针

    入门知识已经梳理完毕了,接下来就进入到面型对象的部分学习了 C语言典型的 面向过程 的,关注的是过程,分析出求解问题的步骤,通过函数调用 逐步解决 问题 C++是典型的基于 面向对象 的,关注的是对象,将一件事情 拆分成不同的对象 ,靠对象之间的交互完成。 将大

    2024年01月19日
    浏览(39)
  • Go语言之流指针类型,new函数

    计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。 我们将内存中字节的

    2024年02月16日
    浏览(36)
  • 类与对象之构造函数

    本文是md导入的可能格式有点乱,希望各位理解一下 默认成员函数:用户没有显式实现, 编译器会生成的成员函数称为默认成员函数 任何类在什么都不写时,编译器会自动生成以下6个默认成员函数 概念 构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由

    2024年02月06日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包