C++Primer 习题5.24-6.2.3

C++Primer 习题5.24-6.2.3

在这里做一个改正,之前的i++需要改成++i,原因详见书籍与STL源码解释,这个原因会在之后的文章中做一个详细的解释。

//5.24
#include<iostream>
#include<stdexcept>
using namespace std;
int main()
{
	int val1, val2;
	cin >> val1;
	cin >> val2;
	if (val2 == 0)
		throw runtime_error("除数不能为0");
	cout << val1 / val2 << endl;
	return 0;
}

//5.25
#include<iostream>
#include<stdexcept>
using namespace std;
int main()
{
	int val1, val2;
	while (cin >> val1 >> val2)
	{
		try
		{
			if (val2 == 0)
				throw runtime_error("除数不能为0");
			cout << val1 / val2 << endl;
		}
		catch (runtime_error err)		//异常可处理
		{
			cout << err.what() << endl;
			cout << "需要继续吗(y,n)" << endl;
			char ch;
			cin >> ch;
			if (ch == 'y'||ch == 'Y')
			{
				cout << "请重新输入" << endl;
				val1 = val2 = 0;
				continue;
			}
			else if (ch == 'n'||ch == 'N')
				break;
		}
	}
	return 0;
}

//6.7
#include<iostream>
using namespace std;
int count()
{
	static int cou = -1;
		return ++cou;
}
int main()
{
	for (int i = 0; i < 10; ++i)
	{
		cout << count() << endl;
	}
	return 0;
}

//6.5
#include<iostream>
using namespace std;
inline int myabs(const int &i)
{
	return (i < 0) ? -i : i;
}
int main()
{
	int a;
	cin >> a;
	cout << myabs(a) << endl;
	return 0;
}

//6.10
#include<iostream>
using namespace std;
void myswap(int *val1, int *val2)
{
	int a = *val1;	
	*val1 = *val2;
	*val2 = a;
}
void myswap(int val1, int val2)
{
	int a = val1;
	val1 = val2;
	val2 = a;
}
void myswapref(int &val1, int &val2)
{
	int a = val1;
	val1 = val2;
	val2 = a;
}
int main()
{
	int val1 = 0, val2 = 1;
	myswap(val1,val2);
	//这里无法与传引用形成多态
	cout << "pass by value " << val1 << " " << val2 << endl;
	//这里拷贝传值,未改变本体
	myswapref(val1, val2);
	cout << "pass by reference " << val1 << " " << val2 << endl;
	int *p1 = &val1, *p2 = &val2;
	myswap(p1, p2);
	cout <<"pass by ptr "<< *p1 << " " << *p2 << endl;
	//这里其实也就是传引用,但可以多态
	return 0;
}

//6.2.2思考
#include<iostream>
#include<string>
using namespace std;
void findchar(const string &s, char c, string::size_type &occurs)
{
	occurs = 0;
	for (decltype(s.size()) i = 0; i != s.size(); ++i)
		if(s[i]==c)
			++occurs;
}
int main()
{
	string str{ "aacvddadedsdnajdjsna" };
	string::size_type time;
	findchar(str, 'a', time);
	cout << time;
	return 0;
}

//6.14
 /*
形参应该是引用的例子:
函数需要改变非主程序的值
或者传入时不需要改变值时再加const
以及避免拷贝的时候,可以加快程序的运行
形参不能是引用的例子:
程序内部不应该修改传入参数的值
但是传入的值需要在函数内进行改变
这时就需要损失一部分性能去保证走完改程序时
void fun(const int i)
这种又有什么用呢??
好像暂时用处不是很大啊
暂时认为这样写程序的人应该缺点啥
*/

//6.2.3回顾与思考
#include<iostream>
using namespace std;
void fun1(int *i)
{
	cout << "形参是int *成功" << endl;
}
void fun2(int &i)
{
	cout << "形参是int &成功" << endl;
}
void fun3(int i)
{
	cout << "形参是int成功" << endl;
}
void fun4(const int &i)
{
	cout << "形参是const int&成功" << endl;
}
void fun5(const int i)
{
	cout << "形参是const int成功" << endl;
}
void fun6(const int *i)
{
	cout << "形参是const int*成功" << endl;
}
int main()
{
	int a = 42;
	int &b = a;
	int *c = &a;
	const int &d = a;
	const int e = a;
	const int *f = &a;
	//cout << a << " " << b << " " << *c << " " << d << " " << *e << endl;
	cout << "传入的实参为int时" << endl;
	//fun1(a);
	cout << "传入形参为int*的函数失败" << endl;
	fun2(a);
	fun3(a);
	fun4(a);
	fun5(a);
	//fun6(a);
	cout << "传入形参为const int*的函数失败" << endl;
	cout << endl << endl;

	cout << "传入的实参为int &时" << endl;
	//fun1(b);
	cout << "传入形参为int*的函数失败" << endl;
	fun2(b);
	fun3(b);
	fun4(b);
	fun5(b);
	//fun6(b);
	cout << "传入形参为const int*的函数失败" << endl;
	cout << endl << endl;

	cout << "传入的实参为int *时" << endl;
	fun1(c);
	//fun2(c);
	cout << "传入形参为int &的函数失败" << endl;
	//fun3(c);
	cout << "传入形参为int的函数失败" << endl;
	//fun4(c);
	cout << "传入形参为const int&的函数失败" << endl;
	//fun5(c);
	cout << "传入形参为const int的函数失败" << endl;
	fun6(c);
	cout << endl << endl;

	cout << "传入的实参为const int&时" << endl;
	//fun1(d);
	cout << "传入形参为int*的函数失败" << endl;
	//fun2(d);//限定符被丢弃
	cout << "传入形参为int &的函数失败" << endl;
	fun3(d);
	fun4(d);
	fun5(d);
	//fun6(d);
	cout << "传入形参为const int*的函数失败" << endl;
	cout << endl << endl;

	cout << "传入的实参为const int时" << endl;
	//fun1(e);
	cout << "传入形参为int*的函数失败" << endl;
	//fun2(e);
	cout << "传入形参为int &的函数失败" << endl;
	fun3(e);
	fun4(e);
	fun5(e);
	//fun6(e);
	cout << "传入形参为const int*的函数失败" << endl;
	cout << endl << endl;

	cout << "传入的实参为const int*时" << endl;
	//fun1(f);
	cout << "传入形参为int*的函数失败" << endl;
	//fun2(f);
	cout << "传入形参为int &的函数失败" << endl;
	//fun3(f);
	cout << "传入形参为int的函数失败" << endl;
	//fun4(f);
	cout << "传入形参为const int&的函数失败" << endl;
	//fun5(f);
	cout << "传入形参为const int的函数失败" << endl;
	fun6(f);
	cout << endl << endl;

	cout << "传入的实参为字面值时" << endl;
	//fun1(1);
	cout << "传入形参为int*的函数失败" << endl;
	//fun2(1);
	cout << "传入形参为int &的函数失败" << endl;
	fun3(1);
	fun4(1);
	fun5(1);
	//fun6(1);
	cout << "传入形参为const int*的函数失败" << endl;
	return 0;
}

/*
传入的实参为int时
传入形参为int*的函数失败
形参是int &成功
形参是int成功
形参是const int&成功
形参是const int成功
传入形参为const int*的函数失败

传入的实参为int &时
传入形参为int*的函数失败
形参是int &成功
形参是int成功
形参是const int&成功
形参是const int成功
传入形参为const int*的函数失败

传入的实参为int *时
形参是int *成功
传入形参为int &的函数失败
传入形参为int的函数失败
传入形参为const int&的函数失败
传入形参为const int的函数失败
形参是const int*成功

传入的实参为const int&时
传入形参为int*的函数失败
传入形参为int &的函数失败
形参是int成功
形参是const int&成功
形参是const int成功
传入形参为const int*的函数失败

传入的实参为const int时
传入形参为int*的函数失败
传入形参为int &的函数失败
形参是int成功
形参是const int&成功
形参是const int成功
传入形参为const int*的函数失败

传入的实参为const int*时
传入形参为int*的函数失败
传入形参为int &的函数失败
传入形参为int的函数失败
传入形参为const int&的函数失败
传入形参为const int的函数失败
形参是const int*成功

传入的实参为字面值时
传入形参为int*的函数失败
传入形参为int &的函数失败
形参是int成功
形参是const int&成功
形参是const int成功
传入形参为const int*的函数失败
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值