随笔分类 -  c/c++

模板特例化
摘要:template class A{ private: T a; public: A(T x) :a(x){} void display() { cout class A { private: double a; public: A(double x) :a(x){} void display() { ... 阅读全文

posted @ 2016-06-20 21:15 Kooing 阅读(121) 评论(0) 推荐(0)

读书笔记_Effective_C++_条款二十五: 考虑写出一个不抛出异常的swap函数
摘要:在之前的理论上调用对象的operator=是这样做的 上面的代码看起来有点麻烦,但它是一个好办法。 我们可以在std里面特化我们的swap 当class也是template以后再说 阅读全文

posted @ 2016-06-19 21:56 Kooing 阅读(173) 评论(0) 推荐(0)

读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数
摘要:老师讲过,一种是类的member函数,一种是non-member函数, 但我们为了封装性,尽量不适用friend,我们可以通过修改类的接口来使用数据 阅读全文

posted @ 2016-06-19 17:51 Kooing 阅读(381) 评论(3) 推荐(0)

读书笔记_Effective_C++_条款二十三:宁以non-member、non-friend替换member函数
摘要:有下面一种情况 你想输出全部的时候 member函数情况 non-member 根据面向对象编程原则,数据和对象捆绑在一起 可能有违你的认知,应该使用non-member函数的形式 因为member对封装的冲击非常大,它可以直接调用里面的成员变量。暂时看上去它很简单,但不妨碍它以后变得膨胀。 与类内 阅读全文

posted @ 2016-06-18 18:45 Kooing 阅读(238) 评论(0) 推荐(0)

读书笔记_Effective_C++_条款二十二:将成员变量声明为private
摘要:1.格式统一 在调用的时候,不会去想有没有(),一律是有get(),或者set()之类的、 2.封装 能直接访问得越少,表明封装性越高, 封装性越高,我们的顾虑就少了, 例如:我们a.data*0.9的时候,不需要调用出来*0.9.只需用public的get()来调用在修改一下就好了 为什么不使用p 阅读全文

posted @ 2016-06-16 22:53 Kooing 阅读(155) 评论(0) 推荐(0)

读书笔记_Effective_C++_条款二十一:当必须返回对象时,别妄想返回其reference
摘要:在栈空间的临时成员变量在函数生命期结束后无法传出 既然栈空间不行,试试堆空间 并不可以,因为你可能会忘记自己new的,即使你没有忘记,但出现((a*b)*c)的情况会使你无法delete 试图以全局变量求得永生,但出现if((a*b)==(c*d))会恒成立 没有办法的时候,pass-by-refe 阅读全文

posted @ 2016-06-16 22:17 Kooing 阅读(159) 评论(0) 推荐(0)

effective_c++条款20,用pass-by-reference-to-const替换pass-by-value
摘要:pass-by-value 1)导致复制是浪费资源 2)多态是导致对象切割 所以我们使用 上面的话针对class,不针对基本类型,函数对象(重载运算符),stl的迭代器。 基本类型:本来就很小,直接复制。 函数对象:暂时不清楚 stl迭代器:暂时不清楚 阅读全文

posted @ 2016-06-16 21:37 Kooing 阅读(135) 评论(0) 推荐(0)

effectivec++条款18,让接口容易被正确使用,不宜被吴勇
摘要:test* create_test(); shared_ptr create_test();//下面的接口比上面的接口要好 auto_ptr create_test(); { shared_ptr p(new test()); return p; } 阅读全文

posted @ 2016-06-15 21:59 Kooing 阅读(126) 评论(0) 推荐(0)

struct可以拥有class般的构造函数
摘要:struct A { int a, b; A(int x, int y) :a(x), b(y){} }; int main() { A a(1, 2); cout << a.a << " " << a.b << endl; } 阅读全文

posted @ 2016-06-15 21:13 Kooing 阅读(177) 评论(0) 推荐(0)

读书笔记_Effective_C++_条款十七:以独立语句将new产生的对象置入智能指针
摘要:int get_int(); void f(shared_ptr a, int); //下面调用 f(new int(3), get_int());//如果是类而不是int就可以会有有explicit,就不能隐式转换 f(shared_ptr a = new int(3), get_int());//还有显式转换 //然而都不是好方法 //从小老师就教导我们不同的编译器,调用参数顺序是不一样的 ... 阅读全文

posted @ 2016-06-15 21:05 Kooing 阅读(206) 评论(0) 推荐(0)

读书笔记_Effective_C++_条款十五:在资源类管理类中提供对原始资源的访问
摘要:void f(int* a) { cout p(new int(3)); f(p.get());//shared_ptr 是无法隐式转换成int* ,但用.get()就可以把她转换回原始指针 } 阅读全文

posted @ 2016-06-15 20:38 Kooing 阅读(113) 评论(0) 推荐(0)

effective条款15,在资源管理类中小心copying行为
摘要:结果 a,b两个对象,根据后构造的先析构。b析构了,然后a又析构,就会导致程序崩溃 下面放出两大办法: 1)禁止复制(copy构造函数和operator=放进private) 2)使用shared_prt类的有计数功能的指针 ...........后面搞不下去,待定 阅读全文

posted @ 2016-06-15 17:03 Kooing 阅读(139) 评论(0) 推荐(0)

const的重载
摘要:补充回一句容易混淆的话: 普通对象可以使用常函数 当有const重载的情况下,优先使用普通函数版本 常数对象只能使用常函数 阅读全文

posted @ 2016-06-15 16:01 Kooing 阅读(197) 评论(0) 推荐(0)

explicit 只对构造函数起作用,用来抑制隐式转换。
摘要:class A { private: int a; public: A(int x) :a(x){} void display(){ cout << a << endl; } void display()const{ cout << "ddd" << endl; } }; void f(A a)//因为下面数据是常量,不能用&;因为用const就不能使用display { a.dis... 阅读全文

posted @ 2016-06-15 15:19 Kooing 阅读(179) 评论(0) 推荐(0)

初次窥见智能指针auto_ptr和shared_ptr
摘要:#include //shared_ptr要用的头文件 using namespace std; class A //测试auto_ptr和shared_ptr的delete能力 { public: A(){ cout p1 = a;//并不能这样初始化 auto_ptr p1(new int(3)); auto_ptr p2(new A); cout p3(p1);//... 阅读全文

posted @ 2016-06-14 20:10 Kooing 阅读(180) 评论(0) 推荐(0)

派生类的拷贝中记得拷贝基类的内容(手写的话)
摘要:如果你没有new,可以使用默认的拷贝构造函数和默认的operator=,她会自动帮你完善 手写拷贝使用的两个函数 1,拷贝构造函数 2,operator=函数 阅读全文

posted @ 2016-06-14 18:59 Kooing 阅读(369) 评论(0) 推荐(0)

在另一个类中做数据成员的对象,可以先不初始化
摘要:在另一个类中做数据成员的对象,可以先不初始化 因为在创建A类的时候,会先调用A的构造函数,同时对B类中的b对象调用他的构造函数 下面测试代码 阅读全文

posted @ 2016-06-14 18:41 Kooing 阅读(441) 评论(0) 推荐(0)

多次继承下,最高层的子类的构造函数不需要写父类以上的构造函数
摘要:和虚拟继承不一样,虚拟继承需要些虚基类的构造函数。 虚拟继承构造函数写法:http://www.cnblogs.com/vhyc/p/5582450.html 阅读全文

posted @ 2016-06-14 17:35 Kooing 阅读(165) 评论(0) 推荐(0)

虚拟继承中子类和父类的构造函数顺序1
摘要:这里的inter1,2,3.要写base2的构造函数 final也写,否则里面的数据未初始化 inert2写的原因是假如有人使用直接使用inert2,里面数据就可以初始化了 总结一下,虚拟继承的基类就像一个指针一样差不多,但又有分别,因为弄了 private会使用不了数据。 以后每个要实现的类都要调 阅读全文

posted @ 2016-06-13 23:20 Kooing 阅读(438) 评论(0) 推荐(0)

安全性良好的operator=操作,和新的new方法(针对深度复制的情况)
摘要:还有一种copy and swap的方法 这个是我用过的旧版本 以前没有特例化swap函数而导致无限重复调用的失败例子 swap(temp, *this);我貌似知道为什么不行了swap里面有temp=*this之类的语句就会调用operator=的函数然后无限重复所以要用自己特例化的swap 阅读全文

posted @ 2016-06-13 18:13 Kooing 阅读(204) 评论(0) 推荐(0)

导航