C++每日编程

C++每日编程,第1张

1. placement new (定位new)和堆栈new的使用

*有个不理解的地方,为什么char buffer[512]经过(void )buffer转换后,可以输出buffer的地址。



两个最大的区别:placement new不能使用delete删除内存,因为delete只能删除堆中分配的内存。


// 定位new运算符的使用:普通new从堆中分配内存,定位new可指定空间。


#include #include using namespace std; int BUF = 512; const int N = 5; char buffer[512]; int main() { double *pd1, *pd2; int i = 0; cout << "Calling new and placement new:\n"; pd1 = new double[N]; pd2 = new (buffer) double[N]; for (i = 0; i < N; i++) { pd1[i] = pd2[i] = 1000 + 20 * i; } cout << "Memory addresses :" << "heap:" << pd1 << " static:" << &buffer << endl; // 两种写法输出相同,为什么? cout << "Memory addresses :" << "heap:" << pd1 << " static:" << (void *)buffer << endl; // 需要进行一个转化,和上边一样。


cout << "Memory contents:\n"; for ( i = 0; i < N; i++) { cout << pd1[i] << "at" << &pd1[i] << ";"; cout << pd2[i] << "at" << &pd2[i] << endl; } cout << "Calling new and placement new \n"; delete [] pd1; // 释放pd1内存。


pd1 = new double[N]; pd2 = new (buffer + N * sizeof(double)) double[N]; // 可开看出,指向上一次地址之后的位置。


for (i = 0; i < N; i++) { pd1[i] = pd2[i] = 1000 + 20 * i; } for (i = 0; i < N; i++) { cout << pd1[i] << "at" << &pd1[i] << ";"; cout << pd2[i] << "at" << &pd2[i] << endl; } delete[]pd1; system("pause"); return 0; }

2. namespace 的用法

说明namespace的用法,案例是332页书上的例子。



包涵一个头文件和两个源文件

// namesp.h 
#ifndef NAMESP_H_	// 防止重复定义
#define NAMESP_H_
#include 

// 定义了两个命名空间,第二个空间包含了第一个空间的Person结构体,用using namespacec pers编译指令。


namespace pers { struct Person { std::string fname; std::string lname; }; void getPerson(Person &); void showPerson(const Person &); } namespace debts { using namespace pers;// 这个位置使用了using 编译文件,在getDebts中可调用pers中的getPerson文件 struct Debt { Person name; double amount; }; void getDebt(Debt &); void showDebt(const Debt &); double sumDebts(const Debt ar[], int n); } #endif

// 第二个文件实现了第一个文件的声明
// namesp.cpp

#include 
#include "namesp.h"

// 第二个文件是源文件,提供了头文件函数原型对应的定义。


namespace pers { using std::cout; using std::cin; using std::endl; void getPerson(Person & rp) { cout << "Enter first name"; cin >> rp.fname; cout << "Enter last name"; cin >> rp.lname; } void showPerson(const Person & rp) { cout << rp.lname << "," << rp.fname<< endl; } } namespace debts { void getDebt(Debt &rd) { getPerson(rd.name); std::cout << "Enter debt:"; std::cin >> rd.amount; } void showDebt(const Debt & rd) { showPerson(rd.name); std::cout << ":" << rd.amount << std::endl; } double sumDebts(const Debt ar[], int n) { double total = 0; for (size_t i = 0; i < n; i++) { total += ar[i].amount; } return total; } }

// 对上边namespace的使用。


// namessp.cpp 
#include 
#include "namesp.h"

void other(void);
void another(void);

int main(void)
{
	using debts::Debt; // 引入结构体

	using debts::showDebt;
	Debt golf = { {"Benny","FFFFF"},120.0 };
	showDebt(golf);
	other();
	another();
	system("pause");
	return 0;
}
void other(void)
{
	using std::cout;
	using std::endl;
	using namespace debts; // 这里包涵了namespace per,所以能使用showPerson 
	Person dg = { "DDDDDD","AAAAAA" };
	showPerson(dg);
	cout << endl;

	Debt zippy[3];
	int i;
	for ( i = 0; i < 3; i++)
	{
		getDebt(zippy[i]);
	}

	for ( i = 0; i < 3; i++)
	{
		showDebt(zippy[i]);
	}
	cout << "Total debt:$" << sumDebts(zippy, 3) << endl;
	return;
}
void another(void)
{
	using pers::Person;
	Person collector = {"Milo","Rightshift"};
	pers::showPerson(collector);
	std::cout << std::endl;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584886.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)

保存