C++ Tips

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必须同时写,这样才不会出现不同的假设


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值