Effective C++ 第二版

原创 条款 7:预先准备好内存不够的情况 set_new_handler

operator new 在无法完成内存分配请求时会抛出异常(以前的做法一般是返回 0,一些旧一点的编译器还这么做)。          用一个很简单的出错处理方法,可以这么做:当内存分配请求不能满足时,调用你预先指定的一个出错处理函数。这个方法基于 一个常规,即当 operator new ...

2015-01-03 15:40:10

阅读数 490

评论数 0

原创 条款 46: 宁可编译和链接时出错,也不要运行时出错

运行时错误的概念和 C++没什么关系,就象在 C 中一样。没有下溢,上溢,除零检查;没有数组越界检查(运行时错误),等等。一旦程序通过了编译和链接,你就得靠自己了----  一切后果自负。         现在的情况下,它的含义就是要避免运行时错误。只要有可能,就要让出错检查从运行时退回到链接时...

2015-01-03 15:05:06

阅读数 485

评论数 0

原创 条款 43: 明智地使用多继承

C++中,关于 MI (多继承)一条不容争辩的事实是,MI 的出现就象打开了潘朵拉的盒子,带来了单继承中绝对不会存在的复杂性。其中,最基本的一条是二义性(参见条款 26) 。如果一个派生类从多个基类继承了一个成员名,所有对这个名字的访问都是二义的;你必须明确地说出你所指的是哪个成员。 class...

2015-01-03 14:44:18

阅读数 400

评论数 0

转载 揭开私有继承的面纱 && 条款 42: 明智地使用私有继承

如果说保护继承大多是为了语言完整性的话,私有继承还是有一些用途的。 私有继承 vs 公有继承 公有继承继承的是接口与实现,它表示了类与类之间is-a的关系。而私有继承继承的仅仅是实现,它表示了has-a (或者 is-implemented-in-terms-of)的关系 ...

2015-01-02 22:39:20

阅读数 389

评论数 0

原创 条款 41: 区分继承和模板

结论: 当对象的类型不影响类中函数的行为时,就要使用模板来生成这样一组类。 当对象的类型影响类中函数的行为时,就要使用继承来得到这样一组类。 下面的代码通过定义一个链表来实现 Stack 类,假设堆栈的对象类型为 T: class Stack { public: Stack(); ~S...

2015-01-02 22:08:25

阅读数 380

评论数 0

原创 条款 40: 通过分层来体现"有一个" 或" 用...来实现"

使某个类的对象成为另一个类的数据成员,从而实现将一个类构筑在另一个类之上,这一过程称为"分层"(Layering) 。            class Address { ... }; // 某人居住之处 class PhoneNumber { ... }; class P...

2015-01-02 21:21:45

阅读数 343

评论数 0

原创 条款 39: 避免"向下转换" 继承层次

class Person { ... }; class BankAccount { public: BankAccount(const Person *primaryOwner, const Person *jointOwner); virtual ~BankAccount(); virtual ...

2015-01-02 20:46:30

阅读数 461

评论数 0

原创 条款 37: 决不要重新定义继承而来的非虚函数

假设类 D 公有继承于类 B,并且类 B 中定义了一个公有成员函数 mf。mf的参数和返回类型不重要,所以假设都为 void。换句话说,我这么写:      class B { public: void mf(); ... }; class D: public B { ... }; D x; ...

2014-12-31 16:53:43

阅读数 522

评论数 0

原创 条款 35: 使公有继承体现"是一个" 的含义

C++面向对象编程中一条重要的规则是:公有继承意味着"是一个"  。一定要牢牢记住这条规则。         当写下类 D("Derived"  )从类 B("Base")公有继承时,你实际上是在告诉编译器(以及读这段代码的人) :类型...

2014-12-31 16:37:04

阅读数 365

评论数 0

原创 条款 30: 避免这样的成员函数:其返回值是指向成员的非 const 指针或引用, 但成员的访问级比这个函数要低

使一个成员为 private 或 protected 的原因是想限制对它的访问,所以写个函数来让用户随意地访问受限的成员没多大意义。所以,如果有个公有函数,返回指向成员的非const指针或引用,成员一般是私有的,那这样就相当于把私有成员暴露给外部接口。          举例如下:      ...

2014-12-30 20:33:26

阅读数 444

评论数 0

原创 条款 17: 在 operator=中检查给自己赋值的情况

自己给自己赋值的情况:         class X { ... };         X a;         a = a; // a 赋值给自己        另一种给自己赋值的情况:         a = b;         如果 b 是 a 的另一个名字(例如,已...

2014-12-30 19:30:54

阅读数 409

评论数 0

原创 条款 13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同

template class Array { public: Array(int lowBound, int highBound); ... private: vector data; // 数组数据存储在 vector 对象中 // 关于 vector 模板参见条款 49 size_t s...

2014-12-28 22:38:14

阅读数 728

评论数 0

原创 条款 16: 在 operator=中对所有数据成员赋值

实际编程中,这意味着写赋值运算符时,必须对对象的每一数据成员赋值: template // 名字和指针相关联的类的模板 class NamedPtr { // (源自条款 12) public: NamedPtr(const string& initName, T *initPtr)...

2014-12-28 20:48:52

阅读数 421

评论数 0

原创 条款 6:析构函数里对指针成员调用 delete

大多数情况下,执行动态内存分配的的类都在构造函数里用 new 分配内存,然后在析构函数里用 delete 释放内存。最初写这个类的时候当然不难做,你会记得最后对在所有构造函数里分配了内存的所有成员使用 delete。         然而,这个类经过维护、升级后,情况就会变得困难了,因为对类的代...

2014-12-28 20:18:26

阅读数 1515

评论数 0

原创 条款 12: 尽量使用初始化而不要在构造函数里赋值

看这样一个模板,它生成的类使得一个名字和一个 T 类型的对象的指针关联起来。 template class NamedPtr { public: NamedPtr(const string& initName, T *initPtr); ... private: string name; ...

2014-12-27 22:55:19

阅读数 760

评论数 0

原创 尽可能使用 const

使用 const 的好处在于它允许指定一种语意上的约束——某种对象不能被修改——编译器具体来实施这种约束。通过 const,你可以通知编译器和其他程序员某个值要保持不变。只要是这种情况,你就要明确地使用 const  ,因为这样做就可以借助编译器的帮助确保这种约束不被破坏。         对指针...

2014-12-27 20:26:21

阅读数 403

评论数 0

原创 条款 22: 尽量用“传引用”而不用“传值”

除非明确指定,函数的形参总是通过“实参的拷贝”来初始化的,函数的调用者得到的也是函数返回值的拷贝。用传值来传递对象,会调用大量的构造函数和析构函数,效率低下。所以,为避免这种潜在的昂贵的开销,就不要通过值来传递对象,而要通过引用。 const Student& returnStu...

2014-12-27 20:00:14

阅读数 436

评论数 0

转载 深入分析C++引用

关于引用和指针的区别的文章很多很多,但是总是找不到他们的根本区别,偶然在codeproject上看到这篇文章,觉得讲的挺好的, 所以翻译了下,希望对大家有帮助。 原文地址: http://www.codeproject.com/KB/cpp/References_in_c__.aspx   引言 ...

2014-12-27 19:42:43

阅读数 484

评论数 1

原创 条款 23: 必须返回一个对象时不要试图返回一个引用

一旦程序员抓住了“传值”在效率上的把柄(参见条款 22) ,他们会变得十分极端,恨不得挖出每一个隐藏在程序中的传值操作。岂不知,在他们不懈地追求纯粹的“传引用”的过程中,他们会不可避免地犯另一个严重的错误:传递一个并不存在的对象的引用。这就不是好事了。         class Rationa...

2014-12-27 19:18:03

阅读数 368

评论数 0

原创 条款 31: 千万不要返回局部对象的引用,也不要返回函数内部用 new 初始化的 指针的引用

返回一个局部对象的引用。它的问题在于,局部对象-----  顾名思义----  仅仅是局部的。也就是说,局部对象是在被定义时创建,在离开生命空间时被销毁的。所谓生命空间,是指它们所在的函数体。当函数返回时,程序的控制离开了这个空间,所以函数内部所在的局部对象被自动销毁。因此,如果返回局部对象的引用...

2014-12-27 18:56:27

阅读数 515

评论数 0

原创 解析局部对象与临时对象

没有名字的对象就是临时对象,它存在于完整的表达式的生存其间。也就是说,当表达式计算结束后就会被释放。一个例外是,当临时对象被引用时,它的生存期将延长到与这个引用的生存期一样长。 局部对象就是可见区域在一个函数范围的对象。 局部对象有两种,静态局部对象的生存期起于所在函数第一次被调用,结束于...

2014-12-27 18:47:32

阅读数 676

评论数 0

转载 18个最热深度学习Github项目逐一介绍

http://www.lupaworld.com/article-241291-1.html

2014-12-21 17:40:12

阅读数 427

评论数 0

原创 找代码的网址

https://code.google.com https://github.com/

2014-12-21 16:57:30

阅读数 576

评论数 0

转载 机器学习的各种资源链接

(1) 如何入门        (每个人都会有自己的入门方式,以下资源仅供参考)        |-- 通用        |-- 公开课资源        |-- coursera.org. 可以说是目前世界上最棒的公开课网站。        |-- 机器学习入门       ...

2014-12-20 11:33:03

阅读数 552

评论数 0

转载 人脸识别必读的N篇文章

人脸识别必读的N篇文章 一.人脸检测/跟踪   人脸检测/跟踪的目的是在图像/视频中找到各个人脸所在的位置和大小;对于跟踪而言,还需要确定帧间不同人脸间的对应关系。   1.Robust Real-time Object Detection. Paul Viola, Michael Jones...

2014-12-19 21:26:04

阅读数 549

评论数 0

转载 计算机视觉、机器学习相关领域论文和源代码大集合--持续更新……

计算机视觉、机器学习相关领域论文和源代码大集合--持续更新…… zouxy09@qq.com http://blog.csdn.net/zouxy09   注:下面有project网站的大部分都有paper和相应的code。Code一般是C/C++或者Matlab代码。 ...

2014-12-19 19:50:35

阅读数 497

评论数 0

转载 机器学习算法中文视频教程

机器学习算法中文视频教程 zouxy09@qq.com http://blog.csdn.net/zouxy09          在网上狂搜ReproducingKernel Hilbert Space的时候,找到了一个好东西。这个是李政軒Cheng-Hsuan Li的关...

2014-12-19 19:47:00

阅读数 1322

评论数 2

原创 条款 14: 确定基类有虚析构函数

class EnemyTarget { public: EnemyTarget() { ++numTargets; } EnemyTarget(const EnemyTarget&) { ++numTargets; } ~EnemyTarget() { --numTargets; ...

2014-12-17 16:24:51

阅读数 379

评论数 0

原创 条款 36: 区分接口继承和实现继承

(公有)继承的概念看起来很简单,进一步分析,会发现它由两个可分的部分组成:函数接口的继承和函数实现的继承. class Shape { public: virtual void draw() const = 0; virtual void error(const string& msg)...

2014-12-17 13:56:55

阅读数 373

评论数 0

原创 条款 11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符

//  一个很简单的 String 类 class String { public: String(const char *value); ~String();  //  没有拷贝构造函数和 operator= private: char *data; }; String::St...

2014-12-17 10:52:58

阅读数 577

评论数 0

原创 条款 27: 如果不想使用隐式生成的函数就要显式地禁止它

假设想写一个类模板 Array,它所生成的类除了可以进行上下限检查外,其它行为和 C++标准数组一样。设计中面临的一个问题是怎么禁止掉 Array 对象之间的赋值操作,因为对标准 C++数组来说赋值是不合法的: double values1[10]; double values2[10];...

2014-12-17 10:34:00

阅读数 443

评论数 0

原创 初始化类中的const 类型 和 引用类型

正确的初始化是通过构造函数的初始化列表来进行,如:    class Test  {    public:    const int MY_MASK;    Test() : MY_MASK(0xff) {}    };   如果不是在初始化列表中对 const 常量进行初始化,而是在构造函数中...

2014-12-17 10:00:28

阅读数 528

评论数 0

原创 条款 45: 弄清 C++在幕后为你所写、所调用的函数

如果你没有声明下列函数,体贴的编译器会声明它自己的版本。这些函数是:一个拷贝构造函数,一个赋值运算符,一个析构函数,一对取址运算符。另外,如果你没有声明任何构造函数,它也将为你声明一个缺省构造函数。所有这些函数都是公有的。 class Empty { public: Empty(); // 缺省...

2014-12-17 09:23:01

阅读数 407

评论数 0

原创 拷贝构造函数,构造函数

当基类中“显示定义了拷贝构造函数和赋值操作符时” 当派生类中“显示定义了拷贝构造函数和赋值操作符时” 如果派生类中的拷贝和赋值构造函数中没有“显示指定基类的拷贝和赋值构造函数”,即:派生类只是把自己的成员进行了赋值 这时需要手动调用基类的拷贝构造函数和赋值构造函数才行,基类的构造函数...

2014-12-11 11:05:05

阅读数 399

评论数 0

原创 条款五 对定制的[型别转换函数保持警觉]

对于自己定义的型别,我们可以选择是否要提供某些函数,供编译器来作为隐式型别转换之用。       两种函数允许执行这样的转化:1.单自变量的constructors 和 隐式型别转换操作符。所谓,单自变量的constructors就是指能够以单一自变量成功调用的constructor.。如此的c...

2014-12-08 10:47:28

阅读数 392

评论数 0

原创 error C2664: “countChar”: 不能将参数 1 从“char [20]”转换为“std::string &”

size_t countChar( string& str,char ch) { cout<<str; return 1; } int main(void) { char buffer[20]; char c; cin>>c>>b...

2014-12-08 10:12:25

阅读数 1086

评论数 0

原创 条款19 了解临时对象的来源

只要你产生一个no-heap-object而没有为它命名,便产生了一个临时对象。           临时对象的产生途径:1.当隐式型别转换被施行起来以求函数能够调用成功。2.当函数返回对象的时候。                    1.当隐式型别转换被施行起来以求函数能够调用成功 s...

2014-12-08 09:46:18

阅读数 530

评论数 0

原创 _BLOCK_TYPE_IS_VALID

出现错误如:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) 可能是类忘了定义拷贝构造函数,特别是含有指针成员的时候,即使指针成员是一般类型,默认的拷贝构造函数似乎能很好的完成任务,但是还是可能出现默名奇妙的错误,我不理解,所以,一定要定义拷贝构造函数。 举例见博...

2014-12-04 10:36:40

阅读数 479

评论数 0

原创 类一定要定义拷贝构造函数,特别是在类成员含有指针的情况(不论指针是何种类型),安全!!!

举例说明一个未定义拷贝构造函数,产生的非常诡异的现象 using namespace std; class people  { private: char *name; int age; public: people(char *namestr,int i); /*people(...

2014-12-04 10:20:17

阅读数 1917

评论数 0

原创 常成员函数只能调用常成员函数 常对象智能调用常成员函数

class A { public:  void print()const{ cout void test() { print();} void test1() const {print();}   }; int main(int argc, char* argv[]) {  A a; a.prin...

2014-12-04 08:54:50

阅读数 986

评论数 0

转载 引用传回左值,左值可赋值,右值不可赋值

函数返回值分为:值,引用,指针三种。引用是c没有而c++有的,并且因为引用是左值实现了运算符连续运算的基础,而值和引用都不可以。下面我们就来看一下这三种返回方式的各自的特点: 1、返回值 [cpp] view plaincopy int...

2014-12-03 12:47:10

阅读数 601

评论数 0

原创 迭代器思想总结

advanced()对于不同的迭代器类型(类型)有不同的实现方式,类似于重载的概念,(不同的参数对应于不同的实现)。所以,可以使用重载,可以为每个迭代器定义一个类型标志符,使用类型标志符来促成重载。 具体实现如下: 首先必须定义五种迭代器的类型标志符:     //5个迭代器类型     stru...

2014-12-03 09:40:46

阅读数 502

评论数 0

转载 STL源码学习之迭代器

1、迭代器是什么?为什么要引入迭代器?   STL是将容器与算法分离开的,我们用到的类模板和函数模板即是用于实现这两个东西,其中类模板用于实现容器,函数模板用于实现算法,在使用的时候需要一个将两者联系起来的东西,这个东西就是迭代器。 例如段代码1所示:算法find 需要访问容器i...

2014-12-03 09:32:41

阅读数 448

评论数 0

原文地址:https://www.cnblogs.com/cx2016/p/12926144.html