User:Just44joy/c++程序设计原理与实践
外观
学习总则
- 纸上得来终觉浅,绝知此事要躬行。
- 不放过任何一个看似简单的题目。
- 一段时间内,专心做一件事。
随想感悟
- from simple to complex 从最简单易懂的输入状况出发,在最简单的输入情况下测试通过,然后测试复杂输入,若出错,则进一步分析和修改程序,再测试,如此反复逐步深入,使得程序慢慢能够处理一般的输入条件。
- 测试一定要考虑完备,无法完全完备则做到尽量完备,很多bug都是很隐秘的,不仔细做输入测试很可能会被忽略,例如下面这个程序段。再一次证明了,真的不要忽视任何一个看似简单的编程题目,其中玩玩隐藏着一些很容易忽视的细节,而这些是你不去动手就不可能发现的问题。
int main()
try {
vector<int> numbers;
int number;
int numOfSum = 0;
cin>>numOfSum;
//cout<<"numOfSum: "<<numOfSum<<'\n';
//cout << (unsigned) numOfSum << endl;
while(cin>>number) {
numbers.push_back(number);
}
//cout<<"numbers.size: "<<(int)numbers.size()<<'\n';
if (numOfSum > numbers.size()) {//此处注意!!!:number.size()返回的是一个无符号整型,而numOfSum是整型,如果numOfSum被赋予一个负值,则结果很可能是true,产生意想不到的结果。
cout<<"numOfSum > numbers.size()\n";
error("The number of values you want to sum is bigger than the size of numbers");
}
int sum = 0;
for (int i = 0; i < numOfSum; i++)
sum += numbers[i];
cout<<"The sum of the first "<<numOfSum<<" is: "<<sum<<'\n';
return 0;
}
catch(exception &e){
cerr<<"error: "<<e.what()<<'\n';
return 1;
}
- 在基本完成,程序能够处理一般的输入条件后,对其做一个输入条件完备的测试,争取考虑到所有可能的输入情况,以此增强程序的健壮性。
- 一段程序,问:输出什么?
#include <iostream>
using namespace std;
struct CLS
{
int m_i;
CLS(int i) : m_i(i) {cout<<"that\n";cout<<m_i<<'\n'; }
CLS()
{
CLS(0);
}
};
int main(void)
{
CLS obj;
cout<<obj.m_i<<endl;
return 0;
}
- 思考:以下程序为什么编译出错?
#include <iostream>
using namespace std;
struct S
{
int a, b;
S(int a_val) {a = a_val;}
S(int aval, int bval)
{
S(aval);
b = bval;
}
};
int main(void)
{
S obj(0, 1);
cout<<"a: "<<obj.a<<" b: "<<obj.b<<endl;
return 0;
}
- 在C++中,一个类的构造函数没法直接调用另一个构造函数,只是构建了一个临时对象,并没有调用另一个构造函数来初始化自己。正确的方法是使用placement new。[1]
- 以下程序中,如何输出p本身的值(p所指向的那个字符的地址),默认输出p所指向的那个字符即字符'a'直至遇到一个结束符'\0'?
#include <iostream>
using namespace std;
int main()
{
char *p = new char('a');
cout<<p<<endl;
return 0;
}
解答:将程序改为如下即可[2]
#include <iostream>
#include <iostream>
using namespace std;
int main()
{
char *p = new char('a');
cout<<static_cast<void *>(p)<<endl;
return 0;
}
chap1
chap2
chap3
chap4
chap5
chap6
chap7
参考资料
- ^ C++中如何在一个构造函数中调用另一个构造函数
- ^ C++中字符型变量的地址输出. [January 13, 2015].