c++ effective
盲人射手的世界
两耳不闻窗外事,一心只读圣贤书
展开
-
文章标题
关于区分接口继承和实现继承 开头,不说,这个程序对于现在基础薄弱的我,实在难得#include <iostream>#include <string>using std::string;using std::cout;如标题所言,class Shape {public: virtual void draw() = 0;//pure virtual fcn virtual v原创 2016-04-13 16:25:01 · 166 阅读 · 0 评论 -
trait
#include <iostream>#include <iterator>#include <typeinfo>#include <vector>using namespace std;//way 1template <typename iterT, typename distT>void advance11(iterT it, distT d){ //random acc原创 2016-05-14 15:04:08 · 183 阅读 · 0 评论 -
takon—union
#include <iostream>#include <string>using namespace std;//cout << ch;//我想定义这个 << 但union当时的值不缺定,遂没办法union Takon1{ friend ostream& operator<<(ostream &os, const Takon& take); char ch; int原创 2016-05-14 15:05:36 · 445 阅读 · 0 评论 -
new,关于effectivec++20页内容来个总结1
关于new_handler,绝对是陌生的,想起之前放弃的MFC中的句柄的概念,觉得差不多,就是操作的new的一种工具,而那个句柄就是一个int,这个就是一个函数指针主意:c++不支持定义自己的new_handler,其实也没有必要,因为完全可以通过set_new_handlertypedef void (*new_handler)();//new_handler与之关系密切的 set_new_han原创 2016-04-21 09:37:20 · 216 阅读 · 0 评论 -
new,关于effective c++ 的总结2
这两个程序一个样class Widget{public: static std::new_handler set_new_handler (std::new_handler p) throw();static void* operator new() throw(std::bad_alloc);private:std::new_handler currentHandler;};//st原创 2016-04-21 10:29:00 · 334 阅读 · 0 评论 -
placement new 总结3
直接上placement new 的定义: placement new ,如果new的参数接受一个参数以上的参数,那么它就是一个placement new ,但一般意义上的placement new ,只接受一个void*,用以使用vector分配但未使用的内存,该章节主要讲了一个log(志记功能)placement new , 但是该条款的名字却是当你定义了一个placement new ,这原创 2016-04-21 11:01:12 · 405 阅读 · 0 评论 -
swap&& ADL
ADL:当编译器对无限定域的函数调用进行名字查找时,除了当前名字空间域以外,也会把函数参数类型所处的名字空间加入查找的范围no_throw 因为雷内特化,操作都是内置类型,更具体的在 item 25template <typename T>inline void swap(classname<T>& a, calssname<T>& b){ return a.swap(b);//调用类内原创 2016-04-21 11:13:19 · 302 阅读 · 0 评论 -
static (msdn about keyword static translation)
static (变量,函数,数据成员,函数成员)默认情况,一个对象或是变量被定义在所有块(block)之外,他拥有static的声明周期和外部连接(external linkage)静态的声明周期意味着变量在程序开始的时候被创建,在结束的时候被销毁,而外部连接意味着变量的名字在文件之外也是可见的,条件是:在该文件中该变量被声明过。相反的,内部链接意味着名字在文件外部不是可见的,即使该变量在那声明过原创 2016-04-21 11:54:02 · 319 阅读 · 0 评论 -
item26控制heap对象的数量
#include using namespace std;class A{public: A();private: ~A();};A::A(){}void main(){ // A a; 1 ctor必须有定义 2 只能用new创建对象 A* pa = new A;}考虑继承和内含#include using namespace std;class原创 2016-05-17 09:14:43 · 204 阅读 · 0 评论 -
item26判断对象是否在堆中
#include using namespace std;/*判断某个对象是否在heap*/class A{public: A() ; class NoOnHeap; A(int ) { } static void* operator new(size_t size); void destroy() { delete this;}protected: //for B sta原创 2016-05-17 09:16:58 · 236 阅读 · 0 评论 -
shared_dtor的另一种策略
#include <iostream>#include <fstream>#include <memory>#include <cstdio>using namespace std;class FileDtor{private: string filenames;public: FileDtor(string& name): filenames(name) { }原创 2016-05-14 15:03:04 · 380 阅读 · 0 评论 -
窄化
#include <iostream>#include <vector>#include <string>#include <queue>using namespace std;;void main(){ vector<int> a1{1}; queue<int> q1{1}; //but int x1(2.1);//ok int x2 = 2.1;//ok原创 2016-05-14 15:01:33 · 389 阅读 · 0 评论 -
shared和unique的基础用法
#include <memory>#include <iostream>#include <vector>#include <string>using namespace std;void main(){ shared_ptr<string>pNico(new string("Nico")); shared_ptr<string>pJutta(new string("Jutt原创 2016-05-14 15:00:41 · 386 阅读 · 0 评论 -
swap
我就是对swap为什么在类内定义一个成员函数,然后在外面定义一个非成员来调用它迷惑! 我觉得我们的初衷是面对pimpl(指针实现的class)才去定义自己版本的swap。 而按照之前类的思想,类内函数,类外实现,类内调用类外也没差,错就错在这思想上,你现在做的工作是有个swap<>,当用它swap class,会先去找一个特例化的实现,由于是交换指针,而非对象,所以又进一步去调用成员swap,搜原创 2016-04-11 18:25:32 · 408 阅读 · 0 评论 -
NVI
这是我写的简易版的, Effective C++, 3rd Edition, Item 35: 考虑可选的 virtual functions(虚拟函数)的替代方法#include<iostream>//item 35using namespace std;/*------------------NVI--------------------*/class A{public: voi原创 2016-04-16 12:03:55 · 380 阅读 · 0 评论 -
EBO,c++编译器有empty继承优化(编译期)
#include <iostream>using namespace std;class empty{ //null};class A : private empty//这种情况下用private{ int s;};class AA { int s; empty e;};void main(){ empty e; A a; AA原创 2016-04-16 12:12:06 · 204 阅读 · 0 评论 -
多重继承
#include <iostream>using namespace std;class A{//interface classpublic: virtual void f() = 0;//has no members shared_ptr<A> createA();//factory_fcn};shared_ptr<A> A::createA(){ //返回一个指针原创 2016-04-16 12:15:01 · 209 阅读 · 0 评论 -
测试私有继承的情况下,private virtual members 的访问权限
#include <iostream>class A{public: void f1() { }//public 一般上都是接口,都是为了 is-a protected: void f2() { }//一般都是实现,//is-implemented-in-terms-ofprivate: void f3() { }//不能被B访问 virtual void f原创 2016-04-16 12:24:19 · 251 阅读 · 0 评论 -
more effective c++ item26 控制对象的数量
#include <iostream>using namespace std;//zero objectclass CantBeInit{private: CantBeInit(); CantBeInit(const CantBeInit &);};//one objiectclass printer{public: void reset(); //voi原创 2016-05-14 14:25:04 · 269 阅读 · 0 评论 -
重写virtual时不写关键字会发生什么
#include <iostream>using namespace std;class A{public: virtual void f() { cout << "A";}};class B: public A{public: void f() { cout << "B";}};void main(){ B b; A* pb = &b原创 2016-05-14 14:32:02 · 612 阅读 · 0 评论 -
把ctor和非成员函数虚化
#include <iostream>//virtual ctor// firstclass NLcomponent{public: virtual NLcomponent* clone() = 0; //...};class TextBlock : public NLcomponent{public: virtual TextBlock* clone() { }原创 2016-05-14 14:58:08 · 312 阅读 · 0 评论 -
模板超编程和tuple的输出
#include <tuple>#include <iostream>#include <string>using namespace std;template <int IDX, int max, typename... Args>struct TUPLE_PRINT{ static void print(ostream& strm,const tuple<Args... >&原创 2016-05-14 14:59:43 · 304 阅读 · 0 评论 -
item31让函数根据一个以上的对象类型来决定如何虚化
#include <iostream>/* >如果宇宙飞船以低速与太空站碰撞,宇宙飞船会泊进太空站(程序没有涉及) 否则宇宙飞船和太空站受到的损害与其速度成正比 >如果宇宙飞船与宇宙飞船碰撞,或是太空站与太空站碰撞,都会受损,受到的损害与其速度成正比 >如果小号的小行星与宇宙飞船或太空站相撞,小行星会损毁。如果碰到的是大号小行星, 那宇宙飞船或太空站损毁原创 2016-05-22 15:49:25 · 284 阅读 · 0 评论