每日一贴,今天的内容关键字为函数条款
effective c++的下载地址
http://download.csdn.net/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的类型,有点怪异。
条款20: 避免public接口出现数据成员
文章结束给大家分享下程序员的一些笑话语录:
问:你觉得让你女朋友(或者任何一个女的)从你和李彦宏之间选一个,你觉得她会选谁?
答:因为李艳红这种败类,所以我没女友!