随笔分类 -  c++

摘要:有时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。 例如一个银行账户类可能需要一个数据成员来表示当前的利率。在此例中,我们希望利率与类关联,而非与类的每个对象关联。从实现效率上来看,没有必要每个对象都存储利率信息。而且更为关键的是,一旦利率浮动,我们希望所有的对象都能使用新值。 阅读全文
posted @ 2018-09-15 14:50 Crystal_Guang 阅读(893) 评论(0) 推荐(2) 编辑
摘要:C 语言中提供了 malloc 和 free 两个系统函数, 完成对堆内存的申请和释放。而 C++则提供了两个操作符 new 和 delete。 1、 newnew 分配内存空间时, 分配内存空间大小可能会(一般都是)大于所需空间大小。 因此, new 会分配至少申请大小的内存空间。A、 开辟单变量 阅读全文
posted @ 2018-09-14 17:16 Crystal_Guang 阅读(459) 评论(0) 推荐(1) 编辑
摘要:1.const引用: 但是加上const之后是可以的,const int &a=100;就不会报错了。 2.函数占位参数: 如果给最后的占位参数加上默认值: 3.内联函数 内联只是对编译器发起一个申请,编译器可以拒绝用户的请求。内联函数只用在普通函数的开头加上inline关键字。 当编译器发现某段代 阅读全文
posted @ 2018-09-11 15:26 Crystal_Guang 阅读(521) 评论(1) 推荐(1) 编辑
摘要:再有默认参数的函数中,一般我们都把默认参数放在声明处而不是定义处。 如果声明和定义都有默认参数,编译器将会报错。 调用含有默认实参的函数时,我们可以包含参数,也可以省略。 有默认参数的函数,我们可以不带参数调用: 所以,在类里面特别要注意,构造函数如果没有参数,此时又存在有所有参数都有默认参数的构造 阅读全文
posted @ 2018-09-10 17:09 Crystal_Guang 阅读(201) 评论(0) 推荐(0) 编辑
摘要:1.register关键字的加强 register修饰符暗示编译程序相应的变量将被频繁地使用,如果可能的话,应将其保存在CPU的寄存器中,以加快其存储速度,这只是一种请求,编译器可以拒绝这种申请。 (1)register变量必须是能被CPU所接受的类型。 这通常意味着register变量必须是一个单 阅读全文
posted @ 2018-09-09 21:12 Crystal_Guang 阅读(358) 评论(0) 推荐(0) 编辑
摘要:C++ 命名空间 C++ 应用程序中。例如,您可能会写一个名为 func() 的函数,在另一个可用的库中也存在一个相同的函数 func()。这样,编译器就无法判断您所使用的是哪一个 func() 函数。 因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函 阅读全文
posted @ 2018-09-09 11:09 Crystal_Guang 阅读(301) 评论(0) 推荐(0) 编辑
摘要:map类型通常被称为关联数组,与正常数组类似,不同之处在于其下标不必是整数。我们通过一个关键字而不是位置来查找值(键值对)。 与之相对,set就是关键字的简单集合。当只是想知道一个值是否存在时,set是最有用的。 类似顺序容器,关联容器也是模板,为了定义一个map,我们必须指定关键字和值得类型。例: 阅读全文
posted @ 2017-03-25 12:35 Crystal_Guang 阅读(391) 评论(0) 推荐(0) 编辑
摘要:隐式捕获: 出了显式列出我们希望使用的来自函数的变量外,还可以让编译器根据lambda体中的代码来推断我们要使用哪些变量。为了指示编译器推断捕获列表,应在捕获列表中写一个&或=。&告诉编译器采用引用捕获方式,=告诉编译器采用值捕获方式。我们可以混合使用隐式或显式捕获,在此条件下,捕获列表的第一个元素 阅读全文
posted @ 2017-03-24 09:43 Crystal_Guang 阅读(222) 评论(0) 推荐(0) 编辑
摘要:捕获列表,只用于局部非static变量,lambda可以直接使用局部static变量和它所在函数之外声明的名字。 eg: 捕获ma,但是ma并未在使用lambda之前并未定义一个局部的ma,故上诉代码报错。 eg: 此时在外部定义全局变量ma,lambda不用捕获列表,依旧可以在表示内使用ma。 当 阅读全文
posted @ 2017-03-23 15:53 Crystal_Guang 阅读(217) 评论(0) 推荐(0) 编辑
摘要:谓词: 谓词是一个可调用的表达式,其返回结果是一个能用作条件的值。标准库算法所使用的谓词分为两类:一元谓词,意味着它只接受单一参数;二元谓词,意味着它有两个参数。接受谓词参数的算法对输入序列中的元素调用谓词,因此,元素类型必须能转化为谓词的参数类型。典型例子如sort排序算法。 有时候,我们需要更多 阅读全文
posted @ 2017-03-22 13:06 Crystal_Guang 阅读(708) 评论(0) 推荐(0) 编辑
摘要:之前的类模板成员函数都定义在类的内部,但是在实际开发中,往往需要将成员函数的实现放在类的外部,先看一个基础类: 然后把上面的代码改成类模板: 这里的学问有很多,友元函数的模板分离有很多要考虑的东西。可细读c++ primer这一章节。 阅读全文
posted @ 2017-03-19 10:46 Crystal_Guang 阅读(541) 评论(0) 推荐(0) 编辑
摘要:与函数模板不同的是,编译器不能为类模板推断模板参数的类型,为了使用类模板,我们必须在模板名后的尖括号中提供额外的消息 用来代替模板参数的模板实参列表。这些额外的信息是显式的模板实参列表,它们被绑定到模板参数。 说明, 阅读全文
posted @ 2017-03-18 21:57 Crystal_Guang 阅读(208) 评论(0) 推荐(0) 编辑
摘要:先看代码,分析调用情况: 函数模板,也可以重载。当函数模板和普通函数名一样时,调用规则是: 1.如果普通函数和函数模板都有完全匹配的参数,优先调用普通函数的,如上面26行代码。 2.函数模板的参数必须严格一致,不能发生隐式转换,但是普通函数可以有隐式类型转换。这个测试需要把上面第一个模板函数屏蔽,调 阅读全文
posted @ 2017-03-18 11:33 Crystal_Guang 阅读(477) 评论(0) 推荐(1) 编辑
摘要:为了实现与数据类型无关的编程,模板应运而生: 模板定义以关键字template开始,后跟模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。当使用模板时,我们隐式或者显式地指定模板实参,将其绑定到模板参数上。(建议都显式指定)。 类型参数前必须使用clas 阅读全文
posted @ 2017-03-17 16:34 Crystal_Guang 阅读(824) 评论(0) 推荐(0) 编辑
摘要:在一个虚函数的声明语句的分号前加上 =0;就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处。纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类。我们不能直接创建一个抽象基类的对象,但可以创建其指针或者引用。值得注意的是,你也可以为纯虚函数提供 阅读全文
posted @ 2017-03-16 10:52 Crystal_Guang 阅读(6595) 评论(1) 推荐(0) 编辑
摘要:只要是指针,就要符合指针的运算方式,不管你是不是类指针; 如果子类在继承了父类之后,没有增加属性,那么此时他们的步长一致,如果子类增加了属性那么子类的步长将大于父类。 eg: 阅读全文
posted @ 2017-03-15 08:59 Crystal_Guang 阅读(349) 评论(0) 推荐(0) 编辑
摘要:之前做过一个测试,在一个类中定义一个virtual修饰的函数时,sizeof这个类,发现类的大小多了恰好一个指针的字节大小,当初不明白,只是记住有这么一个特性。后来,发现它就是c++编译器给我们添加的vptr指针。 当类中声明虚函数时,编译器会在类中生成一个虚函数表; 虚函数表是一个存储成员函数指针 阅读全文
posted @ 2017-03-14 10:49 Crystal_Guang 阅读(4875) 评论(0) 推荐(0) 编辑
摘要:函数重载: 必须在同一个类中进行; 子类无法重载父类的函数,父类同名函数将被子类名称覆盖; 重载是在编译期间根据参数类型和个数决定函数的调用(静态联编)。 函数重写与重定义: 重写: 必须发生在基类和派生类之间,并且父类与子类的函数必须有完全相同的函数原型; 使用virtual关键字声明之后能够产生 阅读全文
posted @ 2017-03-11 13:57 Crystal_Guang 阅读(865) 评论(0) 推荐(0) 编辑
摘要:先看代码: 这样是没问题的(c++编译器会以构造相反的顺序执行析构函数),但是,在很多时候,我们不能在调用函数末尾就delete掉这个内存,还需要和后续交互。比如作为函数参数,为了实现多态,我们函数参数是父类的指针,所以更常见和一般的设计思维是更改paly和main函数如下: 运行结果显示内存泄漏了 阅读全文
posted @ 2017-03-11 11:55 Crystal_Guang 阅读(352) 评论(0) 推荐(0) 编辑
摘要:先看一个例子: 然后我们引进多态,看看代码升级的威力; 用多态的好处:调用一个函数,简化代码结构,关键在于可维护性好。如果现在我又派生了一个类L3,只用调用函数的接口,就可以仅仅增加一个类定义的情况下,完成项目的维护。 实现多态三要素: 1、要有public继承; 2、要有虚函数重写; 3、要有基类 阅读全文
posted @ 2017-03-10 09:50 Crystal_Guang 阅读(343) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示