首页 > 代码库 > 极其重要的分析

极其重要的分析

#include <iostream>using namespace std;class a{    public:        a(){            value ++;            cout <<"default a"<<endl;        }        a(const a&){            value ++;            cout <<"const a"<<endl;        }        a operator=(const a& a1){            cout <<"operator ="<<endl;            return a(a1);        }        void f(){            cout <<"value is "<<value <<endl;        }        ~a(){            cout <<"~a"<<endl;        }    private:        static    int value;};int a::value = http://www.mamicode.com/0;void f1(a a1){    a1.f();    cout <<"f1"<<endl;}a f2(){    cout <<"f2"<<endl;    return a();}void f3(){    a a1,a2;    f1(a1);    a2 = f2();}int main(){    f3();    return 0;}

结果是

default a  f3内的a1调用构造函数
default a  f3内的a2调用构造函数
const a   f1内的的a变量以a1为参数调用构造函数
value is 3  此时有三个a对象了,所以value为3
f1      打印输出f1
~a      f1内的的局部变量退出了作用域,此时调用析构函数
f2      f2内打印输出f2
default a  f2调用默认构造函数
operator =  f2在f3内因为调用=这个运算符,所以才会打印输出
const a
~a
~a
~a
~a



这个其实有问题的,一般而言,有赋值的必须返回*this(=,+=,-=等等)

类似下面这个



#include <iostream>using namespace std;class a{    public:        a(){            value ++;            cout <<"default a"<<endl;        }        a(const a&){            value ++;            cout <<"const a"<<endl;        }        a& operator=(const a& a1){            cout <<"operator ="<<endl;            return *this;        }        void f(){            cout <<"value is "<<value <<endl;        }        ~a(){            cout <<"~a"<<endl;        }    private:        static    int value;};int a::value = http://www.mamicode.com/0;void f1(a a1){    a1.f();    cout <<"f1"<<endl;}a f2(){    cout <<"f2"<<endl;    return a();}void f3(){    a a1,a2;    f1(a1);    a2 = f2();}int main(){    f3();    return 0;}


  4 class a{  5     public:  6         a(int i):value(i){}  7         ~a(){cout <<"~a"<<endl;}  8         a& operator=(const a& a1){  9             this->value =http://www.mamicode.com/ a1.value; 10             return *this; 11         } 12         int get(){return value;} 13     private: 14         int value; 15 };

最好的方法,=,+=,-=,等等这些符号绝对不能导致构造函数,

记住此时

a a1=10;

此时调用的是构造函数虽然用的符号是=这个符号,这一点必须高清晰

 

结果为

 

default a
default a
const a
value is 3
f1
~a
f2
default a

operator =
~a
~a
~a

 

 

极其重要的分析