摘要:
学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。我选择Visual Studio 2008和VC6++作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip无法从以 阅读全文
摘要:
我之前写程序很少去考虑new了一个对象何时去delete。往往我不知道何时这个对象何时不用。Investment* createInvestment();void f(){ Investment* pInv =createInvestment(); .... delete pInv;}看到上面我们要考虑到2种情况:1)当...处有有个条件判断并某个条件成立时return时,这就造成了内存泄露。2)当我们后期维护时难免会在...处修改,这也有可能造成在delete之前发生异常。所以 “我们依靠f()总能执行delete”是不靠谱的。解决办法利用标准库提供的auto_ptr,au... 阅读全文
摘要:
当我们自己为class设计 copy构造函数和copy assignment操作符时,如果我们漏掉一个成员变量时,编译器并不会友好的告诉你,当然有时候我们也是故意这样做。当我们担起“为派生类写copy 函数”时责任重大,必须也要小心的复制其base class部分 如下:class Customer {};class PriorityCustomer:public Customer{public : PriorityCustomer(const PriorityCustomer& rhs); PriorityCustomer& operator= (const Priori.. 阅读全文
摘要:
个人觉的Ubuntu附件自带的抓图工具就很不错了,这个是它的主界面但每次截图都要进去打开它就麻烦了,可不可以设置快捷键呢,就像QQ的那种按下Ctrl+Alt+A就可以截图呢当然可以了(就下大致过程,要想加其它程序快捷键的也类似)首先要查看下这个抓图软件的命令参数,运行一个终端输入gnome-screenshot -h就可以了用法:gnome-screenshot [选项...] 抓取屏幕的图片帮助选项:-h, --help 显示帮助选项--help-all 显示全部帮助选项--help-gtk 显示 GTK+ 选项应用程序选项:-w, --window 抓取窗口,而不是整个屏幕-a, --ar 阅读全文
摘要:
在实现operator=时考虑自我赋值是必要的就像 x=y ,我们不知道变量x与y代表的值是否为同一个值(把x和y说成是一个指针更恰当一点)。如下class bitmap{};class Widget{public: Widget& operator=(const Widget& rhn);private: bitmap *pb; //定义一个指针指向对分配的空间}第一版赋值函数:Widget& Widget::operator=(const Widget& rhs){ delete pb; pb = new bitmap(*rhs.pb); return th 阅读全文
摘要:
如:x = y = z;我们想实现这样的“连锁赋值”在我们的类里应该定义一个operator=的函数并且返回一个*this指针。widget& operator= (const widget& rhn){ .... return *this;} 阅读全文
摘要:
GPL(GNU General Public License) 我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商业软件公司开发的免费软件了。 GPL协议的主要内容是只要在一个软件中使用("使用"指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品 阅读全文
摘要:
主要是两点:1.析构函数绝对不要吐出异常(可以理解为析构函数存在不能正确执行的那种情况)。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。2.如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么class应该提供一个普通的函数(非析构函数)执行该操作。。 阅读全文
摘要:
一般我们用基类的指针指向派生类来实现多态,我们为了避免资源浪费一般在用完派生类的对象时我们都会delete掉。这时我们就会担心一个问题,我们delete掉的指针是基类指针呀!我们能不能达到我们释放掉派生类的目的?这时我们把基类的析构函数声明为virtual即虚析构函数就能够达到我们想要的目的。这就是virtual的魅力所在。相反,如果class不含virtual函数,通常并不意图被用来做一个base class。当class不企图用作基类,令其析构函数为virtual,往往不是一件好事,它会导致整个类的体积增加(主要为了实现虚函数携带的一些信息,如一些虚函数表)。还有一点值得注意的是我们不能把 阅读全文
摘要:
大千世界可定有独一无二的东西(对象),copy构造函数没存在的意义,所以我们就要防止编译器为我们生成copy构造函数,在条款05我们也曾经提过:当我们调用copy构造函数时如果没有定义,编译器会自动为我们生成,我们如何拒绝编译器的盛情呢?我们想到了把自己的类里,声明个private的copy构造函数和copy assignment,如下:class HomeForeSale{public:private: HomeForeSale(const HomeForeSale&); HomeForeSale& operator=(const HomeForeSale&);但.. 阅读全文