感觉自己已经对c++有了初步的了解,并有了点项目实践的经验,所以想要更进一步的学习c++,参考书籍effective C++
一方面复习了C++,也有了进一步的理解
尽量用编译器而不用预处理
用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处理(没理解..以后补回来)
自定义类型的输入输出,用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;
}
malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。
把new和delete与malloc和free混在一起用也是个坏想法
你最好就什么时候都一心一意地使用new和delete吧
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;// 正确
用了typedef后delete也要和原来的格式一样,为了避免混乱,最好杜绝对数组类型用typedefs