• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
demps_c
博客园    首页    新随笔    联系   管理    订阅  订阅
极其重要的分析
#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 = 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 = 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 = 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

 

 

posted on 2014-09-14 00:19  demps_c  阅读(156)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3