effective C++学习文档(1)

感觉自己已经对c++有了初步的了解,并有了点项目实践的经验,所以想要更进一步的学习c++,参考书籍effective C++

一方面复习了C++,也有了进一步的理解

 

Effective 条款1constinline

尽量用编译器而不用预处理

 

const代替#define

 

但要注意两点

(1)      除了指针所指的类型要定义成const外,重要的是指针也经常要定义成const

  比如:const char * const authorName = "Scott Meyers";

 

(2)   另外,定义某个类(class)的常量一般也很方便,只有一点点不同。要把常量限制在类中,首先要使它成为类的成员;为了保证常量最多只有一份拷贝,还要把它定义为静态成员:
   

class GamePlayer {

private:

        static const int NUM_TURNS = 5; // constant eclaration

        int scores[NUM_TURNS];         // use of constant

        ...

};


还有一点,正如你看到的,上面的语句是NUM_TURNS的声明,而不是定义,所以你还必须在类的实现代码文件中定义类的静态成员:

const int GamePlayer::NUM_TURNS;     // mandatory definition;

               // goes in class impl.file

你不必过于担心这种小事。如果你忘了定义,链接器会提醒你。

如果编译不通过的话可以在定义的时候赋值。

 

Inline处理(没理解..以后补回来)

 

 

 

条款2(用iostream代替stdio

自定义类型的输入输出,用stdio就不太好

 

 

class Rational {
public:
        Rational(int numerator = 0, int denominator = 1);
        
        ...
        
private:
        int n, d;// 分子,分母
 
        friend ostream& operator<<(ostream& s, const Rational& );
};
 
ostream& operator<<(ostream& s, const Rational& r)
{
        s<< r.n << '/' << r.d;
        return s;
}

 

 

条款3:尽量用newdelete而不用mallocfree

malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。

newdeletemallocfree混在一起用也是个坏想法

 

你最好就什么时候都一心一意地使用newdelete

 

 

条款5:对应的newdelete要采用相同的形式

NEW在什么时候用:

如果以后你学MFC,那基本上都是要用指针的,那么new就常用了,new是在堆上创建对象,他保存的地址不会自动销毁,但是如果不用new那么在函数
void func()
{
Student st;
st.name="hello";
}
void main()
{
func();
cout<<st.name;//错误的调用
}
st只是局部变量,除了函数st就被销毁了,这样不利于传递参数等,那就得用全局变量了,而new就避免使用全局变量。
void func()
{
Student *st=new Student;
st->name="hello";
}
void main()
{
func();
cout<<st->name;//
正确的调用
}
注意上门两个程序都是片段还有class Student{};没有声明和定义,只是为了说明问题

 

这个问题简单来说就是:要被删除的指针指向的是单个对象呢,还是对象数组?这只有你来告诉delete。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组:

string *stringptr1 = new string;
string *stringptr2 = new string[100];
 
...
 
delete stringptr1;// 删除一个对象
delete [] stringptr2;// 删除对象数组

如果你调用new时用了[],调用delete时也要用[]。如果调用new时没有用[],那调用delete时也不要用[]

 

 

 

typedef string addresslines[4];       //一个人的地址,共4行,每行一个string
                               //因为addresslines是个数组,使用new:
string *pal = new addresslines;       // 注意"new addresslines"返回string*, 和
                               // "new string[4]"返回的一样
delete时必须以数组形式与之对应:
delete pal;// 错误!
delete [] pal;// 正确

用了typedefdelete也要和原来的格式一样,为了避免混乱,最好杜绝对数组类型用typedefs

 

 

你可能感兴趣的:(effective C++学习文档(1))