1. Macro problem 【用const inline 不用#define】
#define max(a,b) ( (a) > (b) ? (a) : (b) )
a = 5 , b = 1;
max( a++, b ) ; // a = 7
max( a++, b+10 ) ; // a = 6
inline int max(int a, int b) { return a > b ? a : b; }
template<class T>
inline const T& max( const T& a, const T& b ) { return a > b ? a : b; }
2. istream & <-> ostream & 【用iostream 不用 scanf ,printf】
namespace Fred;
istream& Fred::operator>>(istream& in, CEmployee& cm)
{
cout<<"Input ID: ";
in>>cm.m_Id;
cout<<"Input Name: ";
in>>cm.m_Name;
cout<<"Input Mail: ";
in>>cm.m_Mail;
return in;
}
ostream& Fred::operator<<(ostream& ou, const CEmployee& cm)
ou<<"ID: "<<cm.m_Id<<endl;
ou<<"Name: "<<cm.m_Name<<endl;
ou<<"Mail: "<<cm.m_Mail<<endl;
return ou;
}
输入NAME时候,有空格,china 空格 CHINA ,
就自动把 china 给了Name , 把CHINA给了Mail ! 怎样接受带空格的内容?
/×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
用getline( cin, string ) 解决! 但上一次读入整型数字ID的时候,会留下 \n 回车符自动给下一个input的string存储。
而直接跳过输入NAME,跳到到输入Mail的执行,
需要用cin.ignore()跳过一个。如果前后上一次本次都是读入string,那么就不用了,
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××/
尝试解决方法如下,有的木有这个函数不起作用;有的是木有
----------------------------------------------------------------------------------------------------
cout<<"Input ID: ";
in>>cm.m_Id;
// in.clear(); no use !
// in.close(); no func !
// fflush(in); no func !
// in.sync(); no use !
in.ignore(); // '\r'
//in.ignore(); // '\n'
cout<<"Test: ";
string str;
getline(in,str);
cout<<"Input Name: ";
//in>>cm.m_Name;
getline(in,cm.m_Name);
cout<<"Input Mail: ";
//in>>cm.m_Mail;
getline(in,cm.m_Mail);
3. Destructor and Constructor 【用new\delete 不用malloc\free】
string *stringarray1 = static_cast<string*>(malloc(10 * sizeof(string))); string *stringarray2 = new string[10];
free(stringarray1); delete [] stringarray2;// 参见条款5:这里为什么要加上个"[]"
Especially:
typedef string addresslines[4]; //一个人的地址,共4行,每行一个string
//因为addresslines是个数组
string *pal = new addresslines; // 注意"new addresslines"返回string*, 和"new string[4]"返回的一样 delete时必须以数组形式与之对应: delete pal;// 错误! delete [] pal;// 正确
addresslines可以定义为一个字符串(string)的向量(vector)
4. 注释风格 " // xxxxx " 【不用 / × ××××× ×/ 】
5. 析构函数中 对指针成员 调用 delete
1)构造函数中成员指针 初始化 分配内存 或 = null
2 ) 删除现有的内存,通过赋值操作符分配给指针新的内存
3 ) 在析构函数里删除指针
6. static pointer
静态成员的初始值都被缺省设为0,没必要显式地将pfreelist设置为空指针。
operator new(在airplane里定义的那个)返回了一个不带头信息的内存的指针,而operator delete(缺省的那个)却假设传给它的内存包含头信息。这就是悲剧产生的原因。这个例子说明了一个普遍原则:operator new和operator delete必须同时写,这样才不会出现不同的假设