c++ primer plus 第六版第十八章编程练习

18.1

//main.cpp
#include<iostream>
#include<initializer_list>
using namespace std;
template<typename T>
double average_list(initializer_list<T>i1)
{
	int count = 0;
	double sum=0;
	for (auto p = i1.begin(); p != i1.end(); p++)
	{
		count++;
		sum += *p;
	}
	return sum / count;
}
int main()
{
	auto q = average_list({ 15.4,10.7,9.0 });
	cout << q << endl;
	cout << average_list({ 20,30,19,17,45,38 }) << endl;
	auto ad = average_list<double>({ 'A',70,65,33 });
	cout << ad << endl;
   return 0;
}

18.2

//#pragma once
//Cpmv.h
#include<iostream>
#include<string>
using std::cout;
using std::endl;
class Cpmv
{
public:
	struct Info
	{
		std::string qcode;
		std::string zcode;
	};
private:
	Info *pi;
public:
	Cpmv() { pi = nullptr; };
	Cpmv(std::string q, std::string z);
	Cpmv(const Cpmv &cp);
	Cpmv(Cpmv &&mv);
	~Cpmv();
	Cpmv &operator=(const Cpmv&cp);
	Cpmv &operator=(Cpmv&&mv);
	Cpmv operator+(const Cpmv &obj)const;
	void Display()const;
};
Cpmv::Cpmv(std::string q, std::string z)
{
	pi = new Info;
	pi->qcode = q;
	pi->zcode = z;
}
Cpmv::Cpmv(const Cpmv &cp)
{
	cout << "Cpmv(const Cpmv &cp)\n";
	pi = new Info;
	pi->qcode = cp.pi->qcode;
	pi->zcode = cp.pi->zcode;
}
Cpmv::Cpmv(Cpmv &&mv)
{
	cout << "Cpmv(Cpmv &&mv)\n";
	pi = mv.pi;
	mv.pi = nullptr;
}
Cpmv::~Cpmv()
{
	delete pi;
}
Cpmv& Cpmv::operator=(const Cpmv&cp)
{
	cout << "operator=(const Cpmv&cp\n";
	if (this == &cp)
		return *this;
	delete pi;
	pi = new Info;
	pi->qcode = cp.pi->qcode;
	pi->zcode = cp.pi->zcode;
	return *this;
}
Cpmv& Cpmv::operator=(Cpmv&&mv)
{
	cout << "operator=(Cpmv&&mv)\n";
	if (this == &mv)
		return *this;
	delete pi;
	//pi = new Info;//赋值语句将pi重新赋值
	pi = mv.pi;
	mv.pi = nullptr;
	return *this;
}

Cpmv Cpmv::operator+(const Cpmv &obj)const
{
	cout << "operator+(const Cpmv &obj)const\n";
	Cpmv temp;
	//delete temp.pi;
	temp.pi= new Info;
	temp.pi->qcode = pi->qcode + obj.pi->qcode;
	temp.pi->zcode = pi->zcode + obj.pi->zcode;
	return temp;

}

void Cpmv::Display()const
{
	cout << "Display()const\n";
	if (pi == nullptr)
		cout << "pi=nullptr\n";
	else
	{
		cout<<"address: "<<pi<< " qcode: " << pi->qcode
			<< " zcode: " << pi->zcode << endl;
	}
}
//main.cpp
#include<iostream>
#include"Cpmv.h"

int main()
{
	using namespace std;
	Cpmv cp1;
	Cpmv cp2("c++", "programming language");
	Cpmv cp3 = cp2;//左值引用的复制构造函数
	cout << "cp1 ";
	cp1.Display();
	cout << "cp2 ";
	cp2.Display();
	cout << "cp3 ";
	cp3.Display();
	cp1 = cp2;//左值引用的赋值运算符
	cout << "cp1 ";
	cp1.Display();
	cout << "cp2 ";
	cp2.Display();
	cp1=cp2 + cp3;//重载+,移动赋值运算符
	cout << "cp1 ";
	cp1.Display();
	cout << "cp2 ";
	cp2.Display();
	cout << "cp3 ";
	cp3.Display();
	Cpmv cp4(cp1 + cp2);//重载+,移动构造函数
	cout << "cp4 ";
	cp4.Display();
	cout << "cp1 ";
	cp1.Display();
	cout << "cp2 ";
	cp2.Display();
   return 0;
}

18.3

//main.cpp
#include<iostream>
long double sum_value() { return 0; };//递归终止条件,必须在模板函数前定义对模板函数可见
//否则递归时将不能使用该函数
template<typename T, typename...Args>
long double sum_value(T value, Args...args)
{
	long double sum =(long double)value+(long double)sum_value(args...);//递归调用
	return sum;
}

int main()
{
	using namespace std;
	cout << sum_value(12, 23, 65, 33)<<endl;
	cout << sum_value('a', 'b', 23, 45, 'c')<<endl;
	cout << sum_value(15.2, 35.3, 45.6, 'A')<<endl;
	//cout << sum_value("you me", 'A', 23, 15.2)<<endl;//字符串类型的参数不能强制转化为浮点型出现编译错误
   return 0;
}

 18.4 未找到对应的函数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值