当前位置: 编程技术>php
本页文章导读:
▪php中拷贝构造函数、赋值运算符重载
对象的赋值与复制: 赋值:通过“ = ”运算符重载User a(10),b;b = a;复制:调用复制构造函数User b;User a(b);或者User a = b;//相当于User a(b);与赋值的区别,赋值是对一个已经存在的对象进行赋值(.........
▪Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
Erlang的比较运算符 opDescription==等于/=不等于=<小于等于<小于>=大于等于>大于=:=精确的等于=/=精确的不等于等于和精确等于的区别: 如果要比较两个数,如果两个数之间是不同的类.........
▪php 调试利器debug_print_backtrace()
如果我们想知道某个方法被谁调用了? debug_print_backtrace可以解决debug_print_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然. 不过这是一个PHP5的专有函数,好在pear中已经.........
[1]php中拷贝构造函数、赋值运算符重载
来源: 互联网 发布时间: 2013-11-30
对象的赋值与复制: 赋值:通过“ = ”运算符重载
User a(10),b;
b = a;
复制:调用复制构造函数
User b;
User a(b);
或者
User a = b;//相当于User a(b);
与赋值的区别,赋值是对一个已经存在的对象进行赋值(已经实现定义了被赋值的对象),而复制是从无到有建立一个新的对象,并使它与已有的对象相同。
浅复制与深复制: 若对象中有指针成员,在复制时,只会将该指针成员的地址复制给新建立的对象,因此,两个对象中的指针成员都指向了同一块内存区域,在释放时会出现重复释放的问题。 需要手动定义复制构造函数,在构造函数中将为指针变量分配新的内存,是不同对象的指针成员指向不同的内存区域。
用到拷贝构造函数的三种情况: 1、需要建立一个新对象,并用另一个同类对象对其进行初始化 2、函数的参数为类的对象时,在调用函数时需要建立一个实参的拷贝,按实参复制一个形参,系统是通过调用拷贝构造函数实现的 3、函数的返回值是类的对象:函数调用结束时,需要将函数中的对象复制一个临时对象,并传给该函数的调用处。
User getUser()
{
User temp;
return temp;
}
int main()
{
User user = getUser();//调用getUser();
}
getUser()函数调用结束时,getUser中建立的对象temp的生命周期结束(即将销毁),所以不是将temp带回main,而是在执行return语句时,调用User类的拷贝构造函数,按temp拷贝一个新的、对象,然后将它赋值给user.
User a(10),b;
b = a;
复制:调用复制构造函数
User b;
User a(b);
或者
User a = b;//相当于User a(b);
与赋值的区别,赋值是对一个已经存在的对象进行赋值(已经实现定义了被赋值的对象),而复制是从无到有建立一个新的对象,并使它与已有的对象相同。
浅复制与深复制: 若对象中有指针成员,在复制时,只会将该指针成员的地址复制给新建立的对象,因此,两个对象中的指针成员都指向了同一块内存区域,在释放时会出现重复释放的问题。 需要手动定义复制构造函数,在构造函数中将为指针变量分配新的内存,是不同对象的指针成员指向不同的内存区域。
用到拷贝构造函数的三种情况: 1、需要建立一个新对象,并用另一个同类对象对其进行初始化 2、函数的参数为类的对象时,在调用函数时需要建立一个实参的拷贝,按实参复制一个形参,系统是通过调用拷贝构造函数实现的 3、函数的返回值是类的对象:函数调用结束时,需要将函数中的对象复制一个临时对象,并传给该函数的调用处。
代码如下:
User getUser()
{
User temp;
return temp;
}
int main()
{
User user = getUser();//调用getUser();
}
getUser()函数调用结束时,getUser中建立的对象temp的生命周期结束(即将销毁),所以不是将temp带回main,而是在执行return语句时,调用User类的拷贝构造函数,按temp拷贝一个新的、对象,然后将它赋值给user.
[2]Erlang的运算符(比较运算符,数值运算符,移位运算符,逻辑运算符)
来源: 互联网 发布时间: 2013-11-30
Erlang的比较运算符
opDescription==等于/=不等于=<小于等于<小于>=大于等于>大于=:=精确的等于=/=精确的不等于等于和精确等于的区别:
如果要比较两个数,如果两个数之间是不同的类型,比如float和int那么,==操作会首先把两个数字转换成相同的相同类型。举例:
1> 1==1.0.
true
2> 1=:=1.0.
false
所以一般推荐用精确等于去比较
比较运算符的大小级别:
number < atom < reference < fun < port < pid < tuple < list < bit string
3> 1 > a.
false
opDescriptionArgument type+
number-
number+
number-
number*
number/浮点数除法,结果是浮点数numberbnot一元not运算符integerdiv整数除法,结果是整数integerrem求玉树integerbandand运算integerboror运算integerbxorxor异或运算integerbsl左移位操作integerbsr右移位操作integer
逻辑运算符
opDescriptionnot一元逻辑notand逻辑andor逻辑orxor逻辑xor原子true 和false表示逻辑的”真”和”假”
此外,逻辑运算符还包括一个orelse 和andalso
原始的or和and是不带”短路运算”操作的,而orelse和andalso是带短路运算操作的。
短路运算举例
Express1 and Express2
Express1 andalso Express2
如果Express1 为假,and会继续判断Express2,然后整体判定为假,而andalso”短路”操作,直接判定整个表达式为假,从效率上来说,andalso会高一些
op Description
== 等于
/= 不等于
=< 小于等于
< 小于
>= 大于等于
> 大于
=:= 精确的等于
=/= 精确的不等于
Examples
> 1==1.0.
true
> 1=:=1.0.
false
> 1 > a.
false
注: 一般语言的 小于等于 是"<=" 而erlang的 "=<" 这样写
opDescription==等于/=不等于=<小于等于<小于>=大于等于>大于=:=精确的等于=/=精确的不等于等于和精确等于的区别:
如果要比较两个数,如果两个数之间是不同的类型,比如float和int那么,==操作会首先把两个数字转换成相同的相同类型。举例:
1> 1==1.0.
true
2> 1=:=1.0.
false
所以一般推荐用精确等于去比较
比较运算符的大小级别:
number < atom < reference < fun < port < pid < tuple < list < bit string
3> 1 > a.
false
opDescriptionArgument type+
number-
number+
number-
number*
number/浮点数除法,结果是浮点数numberbnot一元not运算符integerdiv整数除法,结果是整数integerrem求玉树integerbandand运算integerboror运算integerbxorxor异或运算integerbsl左移位操作integerbsr右移位操作integer
逻辑运算符
opDescriptionnot一元逻辑notand逻辑andor逻辑orxor逻辑xor原子true 和false表示逻辑的”真”和”假”
此外,逻辑运算符还包括一个orelse 和andalso
原始的or和and是不带”短路运算”操作的,而orelse和andalso是带短路运算操作的。
短路运算举例
Express1 and Express2
Express1 andalso Express2
如果Express1 为假,and会继续判断Express2,然后整体判定为假,而andalso”短路”操作,直接判定整个表达式为假,从效率上来说,andalso会高一些
代码如下:
op Description
== 等于
/= 不等于
=< 小于等于
< 小于
>= 大于等于
> 大于
=:= 精确的等于
=/= 精确的不等于
Examples
代码如下:
> 1==1.0.
true
> 1=:=1.0.
false
> 1 > a.
false
注: 一般语言的 小于等于 是"<=" 而erlang的 "=<" 这样写
[3]php 调试利器debug_print_backtrace()
来源: 互联网 发布时间: 2013-11-30
如果我们想知道某个方法被谁调用了? debug_print_backtrace可以解决
debug_print_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然.
不过这是一个PHP5的专有函数,好在pear中已经有了实现,
http://pear.php.net/package/PHP_Compat
测试代码
<?php
class a{
function say($msg) {
echo "msg:".$msg;
echo "<pre>";debug_print_backtrace();
}
}
class b {
function say($msg) {
$a = new a();
$a->say($msg);
}
}
class c {
function __construct($msg) {
$b = new b();
$b->say($msg);
}
}
$c = new c("test");
输出结果
msg:test
#0 a->say(test) called at [/var/www/test/test0723.php:12]
#1 b->say(test) called at [/var/www/test/test0723.php:19]
#2 c->__construct(test) called at [/var/www/test/test0723.php:23]
相关链接
http://ch2.php.net/manual/zh/function.debug-print-backtrace.php
http://ch2.php.net/manual/zh/function.debug-backtrace.php
debug_print_backtrace() 可以打印出一个页面的调用过程 , 从哪儿来到哪儿去一目了然.
不过这是一个PHP5的专有函数,好在pear中已经有了实现,
http://pear.php.net/package/PHP_Compat
测试代码
代码如下:
<?php
class a{
function say($msg) {
echo "msg:".$msg;
echo "<pre>";debug_print_backtrace();
}
}
class b {
function say($msg) {
$a = new a();
$a->say($msg);
}
}
class c {
function __construct($msg) {
$b = new b();
$b->say($msg);
}
}
$c = new c("test");
输出结果
代码如下:
msg:test
#0 a->say(test) called at [/var/www/test/test0723.php:12]
#1 b->say(test) called at [/var/www/test/test0723.php:19]
#2 c->__construct(test) called at [/var/www/test/test0723.php:23]
相关链接
http://ch2.php.net/manual/zh/function.debug-print-backtrace.php
http://ch2.php.net/manual/zh/function.debug-backtrace.php
最新技术文章: