网站读得经验两条:
称为C++的准标库的Boost库。对于C++学习,建议大家经常去看一些科技网站,关注一些C++的开源库,这样很多时候就避免了重复发明轮子的过程。
http://www.csdn.net/article/2012-12-17/2812914
经常阅读帮助文档的。
很关键的一点是,过于在乎代码细节了,完全忽略了思路的重要地位。后来我换了一种学习方法,核心仍旧是以实践为主,不过,不是照抄书上的例子,而是先把例子看完,拿出一张纸,用笔写下例子代码要实现什么功能,第一步做什么,第二步做什么,用到哪些知识,使用了哪些类哪些函数,为什么要用。然后把书合上,就根据纸上写的内容去编程。这种做法有些难度,而且容易出错,不过好处很多,一是挣脱了书本上的示例的束缚,自由发挥空间大,不容易形成定势思维;二是出错了无法通过编译,就会迫使我去主动寻找错误,不知不觉中,我不看书都学会了调试的方法。
“尽信书者则不如无书”,不应该什么都相信书本上说的,上大学二年级的时候,记得有一位老师说过:“给你这本教材,如果你没把其中的知识学会,那你将非常失败;如果你把书中的知识全部学会,勉强给你合格;如果你看完这本书之后,把书中的内容推翻,那你才是一个了不起的人。”
编程其实更应该注重思想,写代码只不过是一个逻辑翻译过程。
http://www.csdn.net/article/2013-02-26/2814263/2
孔子云:“取乎其下,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣”。(读过《effective C++》后,好书真的就是这种感觉。)
0 导读
0-1最佳的用途(我觉得也是学习过程中应该随之思考的):C++如何行为;为什么那样行为;如何利用其行为形成优势。
0-2《Effective C++》提供内容的目的:实现高效的程序;重视移植性;规避编译器难以显漏的问题。
0-3术语
声明式
作者将内置类型(如int)也称为一个对象。
定义式
对对象而言,是编译器为此分配内存的地点(int x);对函数和函数模板来说,提供了代码本体;对类和类模板来说,是列出其成员。
初始化
explicit(明显的,清楚的):禁止进行隐式转换。
class A{
public:
A(); //default 构造函数,不带实参;
};
class B{
public:
exlicit B(intx=0, bool b= ture); //default构造函数,带实参;
};
class C{
public:
explicit C( intx); //不是default构造函数;
};
Copy构造函数与copy assignment操作符(效率是否一致呢?赋值操作符是建立在两个已经存在的对象基础上;拷贝构造函数是构造还未建立的对象。作用的对象不同)
前者“以同型对象初始化自我对象”;后者“从另一个同型对象中拷贝其值到自我对象”。
Widget w1; //调用default构造函数;
Widget w2(w1); //调用拷贝构造函数(copy);
W2=w1; //调用copyassignment操作符;
Widget w2=w1; //调用copy构造函数;一个新的对象被定义,一定会调用构造函数,不会调用赋值符。(也就是说=也能具有拷贝功能)
代码验证0-1: #include <iostream> using namespace std; class Widget{ public: Widget(); Widget(Widget & rhs); Widget & operator=(const Widget & rhs); private: }; Widget::Widget(){ cout<<"default construct"<<endl; } Widget::Widget(Widget & rhs){ cout<<"copy"<<endl; } Widget & Widget:: operator=(const Widget &rhs){ cout<<"copy assignment"<<endl; return *this; //注意返回的为引用类型。 } int main(){ Widget a; Widget b(a); b=a; Widget c=a; return 0; }
对C++程序员来说,尽可能避免不明确的行为。
代码验证0-2:
#include <iostream> using namespace std; int main(){ //int *p=0; // cout<<*p<<endl; //(Vc++6.0编译成功,执行失败) char name[] ="darla"; char c = name[10]; cout<<c<<endl; //(Vc++6.0编译成功,执行输出特殊符号) }