下面主要讨论C++语言中的Object和Function的对象等级问题。
对于C++中的object(对象)和class(类),前者是后者的实例化。Class的定义是一种虚拟化的规则的说明,而object则是具体的类的实现。一个对象有相应的构造函数与析构函数,在程序中动态声明对象的时候,程序会自动调用对象的构造函数,对象失效时,程序会进入对象的析构函数,撤销对象占用的资源。再者,对象可以作为参数传递给函数作为参数,比如在我们经常会看到这样的语句:bool Push(Stack &S, type x),同时对象还能够作为返回值返回。另外,对象有单独的存储实体,C++ 中的Serialize函数就是把对象写入文件或者从文件中读取对象,这说明在对象在文件中有一块独立的存储空间,这一点可以区分出class(类)并不是头等程序对象,因为class只是抽象地声明。而对于以上几点,说明object(对象)在C++语言中是头等对象。
在C和C++语言中,在程序运行过程中,我们不能动态创建一个function,C++中的函数都是实现在程序写好的,然而对于一些函数式的语言来说,Function就是头等程序对象,因为它们可以传递给其他函数作为参数,也能够在程序运行过程中动态地创建与销毁。对于C/C++中得Function,我们可以称之为second-class object(次等对象),因为虽然它不满足严格的头等对象的定义,但是我们可以通过指针类型,辅助function完成上述工作。
在我们实际建模拟合时,若数据中某个变量过度离散,则需要做转化,常见的有做log和根号两种方式。
install.packages('gridExtra')
library(gridExtra)
#先画一个柱状图,观察friend_count这个变量的整体趋势,发现过度离散
p1<-ggplot(aes(x=friend_count),data=pf)+geom_histogram()
#log转化
p2<-p1+scale_x_log10()
#根号转化
p3<-p1+scale_x_sqrt()
#将三张图放在一个面板里
grid.arrange(p1,p2,p3,ncol=1)
最后我们发现,做了log转化的数据更接近正态分布。