牛客 C++刷题day7,8,9,10,11,12
1:C++中基本数据类型只有整型,浮点型,和字符型。其他的逻辑型被整型代替了
2.由于预处理命令没有分号,所以每行只能写一行预处理命令。其次宏替换发生在编译阶段,所以不占用程序运行阶段的时间。
3.形如以下的结构体:
struct
{
。。。。。。
}object;
只定义了一个实体,之后将无法再进行声明和定义,也就是说跟java的匿名类有点类似
3:内联函数是否嵌入代码段不是必然发生的,这个事件的发生跟编译器的选择有关。类型安全的语言是指不会主动把一个类型隐式转换为另外一种类型,比如C++就可以默认将false和true分别转化为0和1.所以C++不是类型安全语言,而java是。
之所以引起类型不安全的问题,是因为程序员使用不得当。第一个例子用到了空类型指针void*,第二个例子则是在两个类型指针之间进行强制转换。因此,想保证程序的类型安全性,应尽量避免使用空类型指针void*,尽量不对两种类型指针做强制转换。
总结:
类型安全是指同一段内存在不同的地方,会被强制要求使用相同的办法来解释(内存中的数据是用类型来解释的)。
Java语言是类型安全的,除非强制类型转换。
C语言不是类型安全的,因为同一段内存可以用不同的数据类型来解释,比如1用int来解释就是1,用boolean来解释就是true。
C++的类型安全
如果C++使用得当,它将远比C更有类型安全性。相比于C,C++提供了一些新的机制保障类型安全:
(1)操作符new返回的指针类型严格与对象匹配,而不是void*;
(2)C中很多以void*为参数的函数可以改写为C++模板函数,而模板是支持类型检查的;
(3)引入const关键字代替#define constants,它是有类型、有作用域的,而#define constants只是简单的文本替换;
(4)一些#define宏可被改写为inline函数,结合函数的重载,可在类型安全的前提下支持多种类型,当然改写为模板也能保证类型安全;
(5)C++提供了dynamic_cast关键字,使得转换过程更加安全,因为dynamic_cast比static_cast涉及更多具体的类型检查。
即便如此,C++也不是绝对类型安全的编程语言。如果使用不得当,同样无法保证类型安全。
4:关于printf的一点注意事项:
printf是先通过I/O输出到缓冲区,然后在缓冲区内取得数据再投送到屏幕。将这一步执行的条件有:
调用flush函数
缓冲区满了
scanf函数调用时,会将缓冲区刷新。
\n进入缓冲区
程序结束时
5:构造函数至少有this这一个参数,并且构造函数,析构函数都可以是内联函数。毕竟我们可以知道inline标识符只是在编译的时候让编译器考虑是否直接在调用处直接展开函数而已。
6:引用也可以产生多态的效果,一个基类的引用可以指向它的派生类实例。如果有虚函数,那么完全可以实现使用基类引用调用派生类的函数。