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*的函数失败
*/