effective c++的下载地址
http://download.youkuaiyun.com/detail/mlkiller/5335383
前言
这几天看来一些学习c++的书籍推荐。
effective c++ 是很多人推荐的,这个也是学习c++的必读之书。
但是个人觉得这本书可能不是特别适合初学c++的人去学习,因为这里面讲的还是比较深,初学者很多精力都集中在编译错误,或者循环控制等等上面,对于语言的细节,还一些精妙的设计反而会让初学者有些害怕,一方面读不懂这本书讲的什么意义,另一方面不明白effective在哪里。
其实,刚开始看这本书的时候,我也被名字直观翻译所混淆,因为这本书会介绍如何提高代码的运行效率,但是读完之后,发现所谓的effective的含义应该是广义的,对于编程呢,我觉得应该有这几点都可以叫做 effective,
第一,代码易读,其实代码是给人看的,这个其实是最重要的一点。
第二,代码的正确性,这本书讲了很多常犯的错误,少犯错误就是提高效率。
调试代码,甚至测试代码花费的时间,往往比写代码的时间要多。
第三,保证你自己写的代码的健壮性,这本身上面讲了很多这方面的问题,有种错误叫不可以预知,就是不是必先的错误确实很难查找。
第四,提高c++自身的效率,比如使用常引用作为函数参数。
条款16: 在operator=中对所有数据成员赋值
#include<iostream>
using namespace std;
class A
{
public:
A(int a);
A& operator=(const A &a);
virtual void print();
private:
int data;
};
A::A(int a):data(a)
{
}
A& A::operator=(const A &a)
{
if(this == &a)
return *this;
data = a.data;
return *this;
}
void A::print()
{
cout<<"A"<<data<<endl;
}
class B:public A
{
public:
B(int i);
B& operator=(const B& b);
virtual void print();
private:
int data;
};
B::B(int i):A(i),data(i)
{
}
B& B::operator= (const B& b)
{
if (this == &b)
return *this;
data = b.data;
}
void B::print()
{
A::print();
cout<<"B"<<data<<endl;
}
class C:public A
{
public:
C(int i);
C& operator=(const C& c);
virtual void print();
private:
int data;
};
C::C(int i):A(i),data(i)
{
}
C& C::operator= (const C& c)
{
if (this == &c)
return *this;
static_cast<A&>(*this) = c;
data = c.data;
}
void C::print()
{
A::print();
cout<<"C"<<data<<endl;
}
int main()
{
B b1(1);
B b2(2);
b1 = b2;
cout<<"-----b1 value--------"<<endl;
b1.print();
cout<<"-----end--------"<<endl;
C c1(1);
C c2(2);
c1 = c2;
cout<<"-----c1 value--------"<<endl;
c1.print();
cout<<"-----end--------"<<endl;
}
A1
B2
-----end--------
-----c1 value--------
A2
C2
-----end--------
条款17: 在operator=中检查给自己赋值的情况
#include<iostream>
#include<string.h>
using namespace std;
class MyString
{
public:
MyString(const char *str=NULL);
MyString& operator=(const MyString &str);
friend ostream& operator<<(ostream &os, const MyString &str);
private:
char *data;
};
MyString::MyString(const char *str)
{
if (NULL == str)
{
data = new char[1];
data = '\0';
}
else
{
data = new char[strlen(str)+1];
strcpy(data, str);
}
}
MyString& MyString::operator=(const MyString &str)
{
//if (this == &str)
//{
//return *this;
//}
delete []data;
data = new char[strlen(str.data) + 1];
strcpy(data,str.data);
return *this;
}
ostream& operator<<(ostream &os, const MyString &str)
{
os<<str.data;
return os;
}
int main()
{
MyString a = "abc";
MyString &b = a;
a = b;
cout<<a<<endl;
}
注释掉的就是判断指向内存相等。
条款18: 争取使类的接口完整并且最小
条款19: 分清成员函数,非成员函数和友元函数
#include <iostream>
using namespace std;
class rational
{
public:
rational(int numerator = 0,int denominator =1);
int num() const;
int denom() const;
friend ostream &operator<<(ostream &os,rational &rat);
private:
int numerator;
int denominator;
};
rational::rational(int num, int denom)
{
numerator = num;
denominator = denom;
}
int rational::num() const
{
return numerator;
}
int rational::denom() const
{
return denominator;
}
ostream& operator<<(ostream &os, rational &rat)
{
os<<"num"<<rat.numerator<<"denom"<<rat.denominator;
return os;
}
rational operator*(rational& input1, rational &input2)
{
return rational(input1.num()*input2.num(),
input1.denom()*input2.denom());
}
int main()
{
rational input1(2,3);
rational input2(3,4);
rational output1;
rational output2;
output1 = input1*input2;
output2 = input1*2;
cout<<output1<<endl<<output2<<endl;
}
但是有个奇怪的地方 output2 = input1 *2;这句话编译不通过,我还没找到原因,编译的错误是无法将int的转换为rational的类型,有点怪异。