linux 搭建日志服务器
2012-06-11 13:51
411 查看
前言:
在c++类中,两个已存在的对象使用“=”赋值,这属于类的赋值,我们可以不用声明opreator =(),编译器会自动给类实现;
使用一个对象来新建一个新的对象的构造函数,称为 复制构造函数/拷贝构造函数。
本文出自 “男儿何不带吴钩” 博客,请务必保留此出处http://liuguangtao.blog.51cto.com/2801521/537723
在c++类中,两个已存在的对象使用“=”赋值,这属于类的赋值,我们可以不用声明opreator =(),编译器会自动给类实现;
使用一个对象来新建一个新的对象的构造函数,称为 复制构造函数/拷贝构造函数。
#include <iostream> #include <string> #include <vector> using namespace std; struct X { //simple test class int val; void out( const string& s,int nv ) { cerr<<this<<"->"<<s<<":"<<val<<"( "<<nv<<")\n"; //注意,下面的构造函数都是先输出再给val赋值的,所以val是不确定的值 } X( ) //default constructed function { out( "X( )" ,0); val=0; } X( int v ) { out( "X( int )" ,v); val=v; } X( const X& x ) //a copy constructed funtion { out( "X( X& )",x.val ); val=x.val; } X& operator =( const X& a ) //a evaluated function { out( "X::operator=( )",a.val); val=a.val; return *this; } ~X( ) //deconstructed function { out( "~X( )",0 ); } }; X glob( 2 ); //a global variable X copy( X a ) {return a;} X copy2( X a ) {X aa=a;return aa;} X& ref_to( X& a ) {return a;} X* make( int i ) {X a( i );return new X( a );} struct XX { X a; X b; }; int main( ) { X loc( 4 ); X loc2=loc; loc=X( 5 ); loc2=copy( loc ); loc2=copy2( loc ); X loc3( 6 ); X& r=ref_to( loc ); delete make( 7 ); delete make( 8 ); vector<X> v( 4 ); XX loc4; X *p=new X( 9 ); delete p; X* pp=new X[ 5 ]; delete [ ] pp; return 0; } 结果如下: winlin@winlin-Satellite:~/Mypro$ ./test 0x6031e0->X( int ):0( 2) // X glob(2); 这是全局变量glob,在main之前赋值,调用X( int ),全局变量初始值为0,val=0 0x7fff47f949e0->X( int ):1207520024( 4) // X loc(4); main中的第一个loc局部变量,调用X( int ),val是随即数1207520024 0x7fff47f949d0->X( X& ):0( 4) //X loc2=loc;main中第二个loc2局部变量,调用X( X& )复制构造函数,val是随机值 0x7fff47f949c0->X( int ):1( 5) //该句和下面2句,都是loc=X(5);一句的结果。首先X(5)先构造一个临时变量 0x7fff47f949e0->X::operator=( ):4( 5) //然后调用赋值构造函数,赋值给loc 0x7fff47f949c0->~X( ):5( 0) //然后析构生成的临时变量 /* X copy( X a ) {return a;} */ 0x7fff47f949b0->X( X& ):1207519696( 5) //loc2=copy(loc); 由于是X copy(X a)使用的是值传递,所以先构造一个临时对象,传递给函数copy() 0x7fff47f949a0->X( X& ):1207519664( 5) //return a; 返回的也是一个构造出来的临时对象 0x7fff47f949d0->X::operator=( ):4( 5) //此时loc2.val=4;调用赋值构造函数 0x7fff47f949a0->~X( ):5( 0) //先析够return产生的临时对象 0x7fff47f949b0->~X( ):5( 0) //再析够作为参数的临时变量 /* X copy2( X a ) {X aa=a;return aa;} */ 0x7fff47f94990->X( X& ):3077560( 5) //copy2(X a);原因同上,值传递要构造一个临时对像 0x7fff47f94980->X( X& ):6303212( 5) //这个是retrun aa;产生的临时对象,应该是由于编译器调整了顺序 0x7fff47f949d0->X::operator=( ):5( 5) //X aa=a 0x7fff47f94980->~X( ):5( 0) //同上原因 0x7fff47f94990->~X( ):5( 0) 0x7fff47f94970->X( int ):6303216( 6) // X loc3(6); /* X& ref_to( X& a ) {return a;} */ // X& r=ref_to( loc ); 由于生成的r并没有在程序中继续使用,所以编译器进行优化,删除了语句 //编译的时候g++会给出提示:test.cpp:78: warning: unused variable ‘r’ /* X* make( int i ) {X a( i );return new X( a );} */ //delete make(7) ; 0x7fff47f948e0->X( int ):1207519616( 7) //X a(i);这一句构造的局部变量a 0x968080->X( X& ):0( 7) //new X(a) ; 调用的复制构造函数 0x7fff47f948e0->~X( ):7( 0) //析构a 0x968080->~X( ):7( 0) //析够new产生的对象 0x7fff47f948e0->X( int ):0( 8) delete make(8); 0x968080->X( X& ):0( 8) 0x7fff47f948e0->~X( ):8( 0) 0x968080->~X( ):8( 0) //vector<X> v(4) 0x7fff47f94960->X( ):4200176( 0) //首先调用默认构造函数生成一个临时对象,用来对 vector v(4)进行初始化 0x968080->X( X& ):0( 0) //对v的四个成员进行初始化 0x968084->X( X& ):0( 0) 0x968088->X( X& ):0( 0) 0x96808c->X( X& ):0( 0) 0x7fff47f94960->~X( ):0( 0) //析构用来初始化的临时对象 /* struct XX { X a; X b; }; */ // XX loc4; 0x7fff47f94950->X( ):6303928( 0) // 调用X的默认构造函数 0x7fff47f94954->X( ):2( 0) //X *p=new X(9); 0x9680a0->X( int ):0( 9) //构造一个新的对象,X *p直接让p指向该对象即可 0x9680a0->~X( ):9( 0) //delete p; // X *pp=new X[5]; 0x968018->X( ):6( 0) //生成5个X对象,调用默认构造函数 0x96801c->X( ):0( 0) 0x968020->X( ):-1( 0) 0x968024->X( ):0( 0) 0x968028->X( ):539515006( 0) 0x968028->~X( ):0( 0) //delete pp;析构这5个变量。注意析构的顺序,先构造后析构 0x968024->~X( ):0( 0) 0x968020->~X( ):0( 0) 0x96801c->~X( ):0( 0) 0x968018->~X( ):0( 0) 0x7fff47f94954->~X( ):0( 0) //这时析构的是 XX loc4,中的两个X 对象 0x7fff47f94950->~X( ):0( 0) 0x968080->~X( ):0( 0) //这时析构vector<X> v(4)的四个X对象 0x968084->~X( ):0( 0) 0x968088->~X( ):0( 0) 0x96808c->~X( ):0( 0) 0x7fff47f94970->~X( ):6( 0) //析构loc3 0x7fff47f949d0->~X( ):5( 0) //析构loc2 0x7fff47f949e0->~X( ):5( 0) //析构loc1 0x6031e0->~X( ):2( 0) //析构全局变量glob winlin@winlin-Satellite:~/Mypro$ 后记:不知道结果中的地址数据有什么更深的含义?从这些简单的地址中我们能否得到什么令人兴奋的秘密那?
本文出自 “男儿何不带吴钩” 博客,请务必保留此出处http://liuguangtao.blog.51cto.com/2801521/537723
相关文章推荐
- linux for cisco 日志服务器搭建
- Linux学习日志day2 Part1——搭建freeIPA服务器实现用户管理以及SSH服务远程登录
- LINUX 日志服务器的搭建
- 关于搭建linux日志服务器
- Linux通过Rsyslog搭建集中日志服务器
- [LINUX] 搭建日志服务器
- 虚拟机 linux6.8 搭建日志服务器笔记
- linux日志服务器搭建
- linux for cisco 日志服务器搭建
- Linux之日志文件服务器搭建
- 用LINUX+SYSLOG-NG+PHP-SYSLOG-NG搭建日志服务器
- linux日志服务器搭建
- 用LINUX+SYSLOG-NG+PHP-SYSLOG-NG搭建日志服务器
- /var/log目录下的20个Linux日志文件功能详解 分类: 服务器搭建 linux内核 Raspberry Pi 2015-03-27 19:15 80人阅读 评论(0) 收藏
- linux syslog日志服务器的搭建
- Linux下搭建日志服务器
- Linux 日志服务器搭建(rsyslog+loganalyzer)
- 在Windows环境下搭建Linux系统的日志服务器.htm
- linux syslog日志服务器的搭建
- Linux 日志服务器搭建(rsyslog+loganalyzer)