分类目录归档:技术谈

only for coding

C++ primer 学习笔记(第七章)

这一章看的没之前那么仔细,只是囫囵吐枣的看了一遍。

  • 构造函数的初始值有时必不可少

有时候数据成员的赋值和初始化是可以忽略区别的。但是如果成员是const或者引用的话就必须要初始化了。这是因为,如果没有在构造函数的初始值列表中显式的初始化成员,他会在构造函数体执行之前执行默认初始化。当然初始值必不可少的情况也适用于:当成员属于某种类类型而且该类没有定义默认构造函数的话。

  • 成员初始化的顺序

构造函数初始值列表只说明用于初始化成员的值,而不限定初始化的具体执行顺序,成员初始化的具体执行顺序与他们在类内出现的顺序一致。

  • 隐式的类类型转换

先看一份丑丑的code:

声明了一个接受string的构造函数,我们相当于定义了从这种类型向PP隐式转换的规则。我们调用a的sum方法,编译器用给定的string自动生成了一个PP对象,新生成的这个对象传递给了sum。但是这种类型转换只允许一步转换。所以这样写编译器就会报错了。

因为这里使用了两种类型转化:“999”到string类型的转换,string类型到PP的类型转换。当然我们如果显式声明转换就可以啦。

当然我们也可以抑制构造函数定义的隐式转换。我们可以把构造函数声明为explicit就可以了。但是只能在类内声明构造函数使用explicit关键词。而且explicit构造函数只能用于直接初始化。

对于explicit构造函数虽然我们无法隐式转换,但是显式类型强转还是可以的。

C++ primer 学习笔记(第六章)

纯粹笔记向,只记录一些我觉得比较坑或者需要注意或者值的思考的地方。

  • 6.2.2 传引用参数

1.使用引用避免拷贝

这个还是比较常见的,如在vector,string以及较大的类或者结构体的拷贝中是十分低效的。最好使用引用。

  • 6.2.3 const形参和实参

1.首先介绍两个概念,顶层const是指指针本身是一个常量,底层const代表指针所指的对象是一个常量。实参初始化的过程中会忽略掉顶层const,所以当形参有顶层const时,传给它常量对象或者非常量对象都是可以的。而这就意味着如下的两句代码是编译不过去的(因为在编译的时候他们被视为形参列表相同):

  • 6.2.6 含有可变形参的函数

1.C++11提供了一种方法解决所有实参类型相同,但个数不定的情况的方法:传递一个类型为initializer_list的标准库类型的形参。它定义在同名的头文件中,其实相当于一种特定类型的值的数组。另外initializer_list对象中的元素永远是常量值。并且用花括号列表初始化该类型的对象。

2.省略符形参

只能出现在形参列表的最后一个位置,省略符省略的部分无需类型检查。

  • 6.3.2 引用返回左值

调用一个返回引用的函数得到的是左值,其余的返回类型为右值。所以下面的代码完全是合法的。只要返回类型为非常量引用我们便可以为函数结果赋值。(感觉有点好玩啊)

  • 6.3.3 返回数组指针

这里主要写一下尾置返回类型(C++11)和使用decltype来解决这个问题。因为这两种是在学C的时候没有碰到的。

1.使用尾置返回类型

这种形式主要用于返回类型比较复杂的函数,如数组的指针或者数组的引用。  尾置返回类型跟在形参列表后并以->开头。为了表示函数真正的返回类型在形参列表之后,我们在本应出现返回类型的地方写上一个auto。

2.当然如果我们知道函数返回的指针将指向哪个数组,就可以用decltype来声明返回类型。但是这样decltype的结果仍然是一个数组,所以要返回指针的话还需要在后面加上一个*,来代表指针。

比如这样:

  • 6.5.2内联函数和constexpr函数

constexpr函数是指能用于常量表达式的函数。但它的返回类型和 所有形参类型都必须是字面值类型,并且有且只有一条return语句,编译器会把对它的调用结果替换成结果值。当然其实这个函数也是可以返回非常量的结果的,但是那样就不能用在常量表达式的上下文。另外constexpr函数被隐式的指定为内联函数。

  • 6.5.3调试帮助

1.assert预处理宏

assert宏使用一个表达式作为它的条件:

首先对expr求值,如果为真assert什么都不做,如果为假,assert输出信息并终止程序的执行。

2.NDEBUG预处理变量

assert的行为依赖于一个名为NDEBUG的预处理变量的状态,如果这个变量定义了:#define NDEBUG,从而关闭调试状态,assert什么都不做,反之assert将执行运行时检查。

当然如果未定义NDEBUG,也会将执行#ifndef和#endif之间的代码的,反之不会执行。

  • 6.7 函数指针

函数指针指向的类型由返回类型和形参类型共同决定。当我们把函数名作为一个值使用时,函数自动转化为指针。如:

此外,我们可以通过直接使用指向函数的指针来调用该函数,而无需提前解引用指针。

另外也可以通过decltype以及尾置返回的方式来返回一个函数指针,这样可能更方便一些。也更易于阅读吧。

 

第六章初步读完。

JavaScript中如何输出空格

看了一点JavaScript的东西,发现了这个问题总结一下,回来再补充更多的方法。

一般我们在js中写

其实在浏览器显示出来的还是1 2 3这样子,中间只有一个空格。

在网上查的有两种方案:

1.使用html标签

2.使用css样式

white-space:pre这个属性,表示空白会被浏览器保留。。。