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';
    //此处注意!!!:number.size()返回的是一个无符号整型,而numOfSum是整型,如果numOfSum被赋予一个负值,则结果很可能是true,产生意想不到的结果。
    if (numOfSum > numbers.size()) {
        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[编辑]

参考资料[编辑]

外部链接[编辑]

PPP Support Website