随笔分类 -  C++笔记

摘要:当使用容器存放继承体系中的对象时,通常必须采用间接存储的方式。 因为不允许在容器中保存不同类型的元素,所以不能把具有继承体系关系的多种类型的对象直接存放在容器当中。 当派生类对象被赋值给基类对象时,其中的派生类部分将被“切掉”,因此容器和存在继承关系的类型无法兼容。 在容器中放置(智能)指针而非对象 阅读全文
posted @ 2020-08-21 15:51 CodeWithMe 阅读(198) 评论(0) 推荐(0)
摘要:虚析构函数 继承关系对基类拷贝控制最直接的影响是基类通常应该定义一个虚析构函数,这样就能动态分配继承体系中的对象了。 当 delete 一个动态分配的对象的指针时将执行析构函数。如果该指针指向继承体系中的某个类型,则有可能出现指针的静态类型与被删除对象的动态类型不符的情况。 通过在基类中将析构函数定 阅读全文
posted @ 2020-08-15 13:36 CodeWithMe 阅读(305) 评论(0) 推荐(0)
摘要:每个类定义自己的作用域,在这个作用域内定义类的成员。 当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。 如果一个名字在派生类的作用域内无法正确解析,则编译器将继续在外层的基类作用域中寻找该名字的定义。 在编译时进行名字查找 一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。 即 阅读全文
posted @ 2020-08-12 11:47 CodeWithMe 阅读(181) 评论(0) 推荐(0)
摘要:受保护的成员 protect 关键字来声明那些希望与派生类分享但是不想被其他公共访问使用的成员: 和私有成员类似,受保护的成员对于类的用户来说是不可访问的。 和公有成员类似,受保护的成员对于派生类的成员和友元是可访问的。 派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类 阅读全文
posted @ 2020-07-12 11:16 CodeWithMe 阅读(160) 评论(0) 推荐(0)
摘要:派生类必须通过使用类派生列表明确指出它是从哪个基类继承而来的。 类派生列表的形式:首先是一个冒号,后面紧跟以逗号分隔的基类列表。 每个基类前面可以有以下三种访问说明符中的一个:public、protected 或者 private 。 派生类必须将其继承而来的成员函数中需要覆盖的那些重新声明。 如果 阅读全文
posted @ 2020-06-27 18:24 CodeWithMe 阅读(469) 评论(0) 推荐(0)
摘要:只读算法 accumulate 函数接受三个参数,前两个指出了需要求和的元素的范围,第三个参数是和的初值: 算法和元素类型 序列中元素的类型必须与第三个参数匹配,或者能够转换为第三个参数的类型。 string 定义了 + 运算符,可以通过调用 accumulate 将 vector 中所有 stri 阅读全文
posted @ 2020-01-05 23:17 CodeWithMe 阅读(182) 评论(0) 推荐(0)
摘要:标准库算法 find: find 将范围中每个元素与给定值进行比较,返回指向第一个等于给定值的元素的迭代器。 范围中无匹配元素,返回第二个参数来表示搜索失败。 可以通过比较返回值和第二个参数来判断搜索是否成功。find操作的是迭代器,可以用同样的find在任何容器中查找值。 find 在一个 str 阅读全文
posted @ 2019-12-27 17:29 CodeWithMe
摘要:声明静态成员 定义一个类,表示银行账户: 类的静态成员存在于任何对象之外,对象中不包括任何与静态数据成员有关的数据。 静态成员函数不能声明成 const 的,不能在 static 函数体内使用 this 指针。 使用类的静态成员 作用域运算符直接访问静态成员: 使用类的对象、引用或者指针来访问静态成 阅读全文
posted @ 2019-10-08 22:29 CodeWithMe 阅读(215) 评论(0) 推荐(0)
摘要:数据成员都是字面值类型的聚合类是字面值常量类。 如果一个类不是聚合类,成为一个字面值常量类符合的要求: 数据成员都必须是字面值类型。 类必须至少含有一个 constexpr 构造函数。 如果一个数据成员含有类内初始值,则内置类型成员的初始值必须是一条常量表达式。或者如果成员属于某种类类型,则初始值必 阅读全文
posted @ 2019-10-07 15:47 CodeWithMe 阅读(447) 评论(0) 推荐(0)
摘要:当一个类满足如下条件,是聚合的: 所有成员都是 public 的。 没有定义任何构造函数。 没有类内初始值。 没有基类,也没有 virtual 函数。 一个聚合类: 提供一个花括号括起来的成员初始值列表,并用它初始化聚合类的数据成员: 初始值的顺序必须与声明的顺序一致: 初始值列表中的元素个数少于类 阅读全文
posted @ 2019-10-06 13:20 CodeWithMe 阅读(365) 评论(0) 推荐(0)
摘要:isbn 函数的参数列表为空,返回值是一个 string 对象: 引入 this 对 isbn 的成员函数的调用: 成员函数通过一个名为 this 的额外的隐式参数来访问调用它的那个对象。调用一个成员函数时,用请求该函数的对象地址初始化 this 。 编译器负责把 total 的地址传递给 isbn 阅读全文
posted @ 2019-08-02 14:42 CodeWithMe 阅读(302) 评论(0) 推荐(0)
摘要:Sales_data 的接口应该包含以下操作: 一个 isbn 成员函数,用于返回对象的 ISBN 编号 一个 combine 成员函数,用于将一个 Sales_data 对象加到另一个对象上 一个名为 add 的函数,执行两个 Sales_data 对象的加法 一个 read 函数,将数据从 is 阅读全文
posted @ 2019-08-01 19:40 CodeWithMe 阅读(403) 评论(0) 推荐(0)
摘要:函数指针的类型由它的返回值和形参类型共同决定,与函数名无关: 函数的类型是 bool lengthCompare(const string&, const string&)。 要想声明一个可以指向该函数的指针,只需要用指针替换函数名即可: pf 是一个指向函数的指针,其中该函数的参数是两个 cons 阅读全文
posted @ 2019-07-25 09:53 CodeWithMe 阅读(212) 评论(0) 推荐(0)
摘要:精确匹配: 需要类型提升和算术类型转换的匹配 小整型一般会提升到 int 类型或更大的整数类型: 所有的算术类型转换的级别都是一样: 字面值 3.14 的类型是 double ,它既能转换成 long 也能 转换成 float 。因为存在两种可能的算数类型转换,所以该调用具有二义性。 函数匹配和 c 阅读全文
posted @ 2019-07-24 09:17 CodeWithMe 阅读(229) 评论(0) 推荐(0)
摘要:几个重载函数的形参数量相等以及某些参数的类型可以由其他类型转换得来时: 确定候选函数和可行函数 第一步选定本次调用对应的重载函数集,集合中的函数称为候选函数。 候选函数特征: 与被调用的函数同名 声明在调用点可见 第二步考察本次调用提供的实参,然后从候选函数中选出能被这组实参调用的函数,这些新选出的 阅读全文
posted @ 2019-07-23 12:03 CodeWithMe 阅读(247) 评论(0) 推荐(0)
摘要:比较两个 string 形参的长度并返回长度较小的 string 的引用,把规模较小的操作定义成函数的好处: 阅读和理解 shorterString 函数的调用比读懂等价的条件表达式容易得多。 使用函数可以确保行为的统一,每次相关操作都能保证按照同样的方式进行。 修改计算过程,修改函数要比先找到等价 阅读全文
posted @ 2019-07-22 16:19 CodeWithMe 阅读(311) 评论(0) 推荐(0)
摘要:调用含有默认实参的函数时,可以包含该实参,也可以省略该实参。 使用 string 对象表示窗口的内容,为了使得窗口函数既能接纳默认值,也能接受用户指定的值,定义如下的形式: 默认实参作为形参的初始值出现在形参列表中,一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。 使用默认实参调用函数 阅读全文
posted @ 2019-07-21 16:11 CodeWithMe 阅读(390) 评论(0) 推荐(0)
摘要:如果在内层作用域中声明名字,它将隐藏外层作用域中声明的同名实体。在不同的作用域中无法重载函数名字: 编译器调用 read 的请求时,找到的是定义在局部作用域中的 read 。这个名字是布尔变量,语句非法。 在 fooBar 内声明的 print(int) 隐藏了之前两个 print 函数,因此只有一 阅读全文
posted @ 2019-07-20 11:54 CodeWithMe 阅读(403) 评论(0) 推荐(0)
摘要:重载函数:同一作用域内的几个函数名字相同但形参列表不同: 当调用函数时,编译器会根据传递的实参类型推断想要的是哪个函数: main 函数不能重载。 定义重载函数 典型的数据库应用,创建几个不同的函数分别根据名字、电话、账户号码等信息查找记录,函数的名字都是 lookup,但是查找的依据不同: 重载函 阅读全文
posted @ 2019-07-18 14:44 CodeWithMe 阅读(229) 评论(0) 推荐(0)
摘要:因为数组不能被拷贝,所以函数不能返回数组。函数可以返回数组的指针或引用。 使用类型别名定义一个返回数组的指针或引用的函数: arrT 是含有10个整数的数组的别名。因为我们无法返回数组,所以将返回类型定义成数组的指针。 声明一个返回数组指针的函数 要想在声明 func 时不使用类型别名,必须牢记被定 阅读全文
posted @ 2019-07-17 11:17 CodeWithMe 阅读(947) 评论(0) 推荐(0)