c++11学习笔记(3)
(1)如果不允许隐式转换,就是阻止隐式转换的话,就要在构造函数前面加上一个explicit。关键字explicit只对一个实参的构造函数有效,需要多个实参的构造函数不能用于执行隐式转换,所以无须将这些构造函数指定为explicit的。只能在类内声明构造函数的时候使用这个关键字,在类外面定义的时候不应该重复。
(2)尽管编译器不会将explicit的构造函数用于隐式转换过程,但是我们可以使用这样的构造函数显式的进行强制转换。
item. combine(sales_data(null_book));
item. combine(statuc_cast<sales_data>cin)
(3)聚合类使得用户可以直接访问其成员,并且具有特殊的初始化语法形式。当一个类满足如下条件时,我们说它是聚合的。
所有成员都是public的。没有定义任何构造函数。没有类内初始值。没有基类也没有virtual函数。
(4)尽管构造函数不能是const的,但是字面值常量类的构造函数可以是constexpr函数。事实上,一个字面值常量类必须至少提供一个constexpr构造函数。
(5)有时候类需要它的一些成员和类本身直接相关,而不是和类的各个对象保持关联。例如,一个银行账户类可能需要一个数据成员来表示当前的基准利率。在这个例子中,我们希望利率和类关联,而不是和类的每个对象关联。
(6)我们通过在成员的声明之前加上关键字static使得其与类关联在一起。和其他成员一样,静态成员可以是public或private的,静态数据成员的类型可以是常量,引用,指针,类类型等。
class account { public: void calculate( ) { amount += amount * interestRate; } static double rate() { return interestRate;} static void rate(double); private: string owner; double amount; static double interestRate; static double initRate(); }
(7)类的静态成员存在于任何对象之外,对象中不包含和静态数据成员有关的数据。因此,每个account对象将包含两个数据成员owner和amount。只存在一个interesteRate对象而且它被所有account对象共享。
(8)类似的,静态成员函数也不和任何对象绑定到一起,它们不包含this指针。作为结果,静态成员函数不能声明成const的,而且我们也不能在static函数体内使用this指针。这个限制既适用于this的显式使用,也对调用非静态成员的隐式使用有效。
(9)虽然静态成员不属于类的某个对象,但是我们仍然可以使用类的对象,引用或者指针来访问静态成员。
double r; r = account::rate(); account ac1; account *ac2 = &ac1; r=ac1.rate; r=ac2->rate;
(10)因为静态数据成员不属于类的任何一个对象,所以它们并不是在创建类的对象时候被定义的。这意味着它们不是由类的构造函数初始化的。而且一般,我们不能在类的内部初始化静态成员。相反的,必须在类的外部定义和初始化每个静态成员。和其他对象一样,一个静态数据成员只定义一次。
(11)和其他的成员函数一样,我们既可以在类的内部也可以在类的外部定义静态成员函数。当在类的外部定义静态成员时,不能重复static关键字,该关键字只能出现在类内部的声明语句。
(12)类似于全局变量,静态数据成员定义在任何函数之外,因此一旦它被定义,就将一直存在于程序的整个生命周期中。
(13)我们定义静态数据成员的方式和在类的外部定义成员函数差不多。我们需要指定对象的类型名,然后是类名,作用域运算符自己成员自己的名字。
如下定义并初始化一个静态成员
double account::interesteRate=initRate();
(14)要想确保对象只定义一次,最好的办法就是把静态数据成员的定义和其他非内联函数的定义放在同一个文件中。
(15)静态成员独立于任何对象,因此,在某些非静态数据成员可能非法的场合,静态成员却可以正常使用。举个例子,静态数据成员可以是不完全类型。特别的,静态数据成员的类型可以就是它所属的类类型。而非静态数据成员则受到限制,只能声明成它所属类的指针或引用。
(16)第十章会介绍泛型算法,这类算法通常在顺序容器一定范围内的元素上或其他类型的序列上进行操作。算法库为经典算法提供了高校的实现,如排序和搜索算法,还提供了其他一些常用操作。例如,标准库提供了copy算法,完成一个序列到另一个序列的元素拷贝,还提供了find算法,实现给定元素的查找。泛型算法的通用性体现在两个层面:可以应用于不同类型的序列,对序列中元素的类型限制小,大多数类型都允许的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下