极其重要的分析

#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

 
时间: 2024-08-10 15:09:39

极其重要的分析的相关文章

希尔排序的分析及实现

思想:先将整个待排记录序列分割成若干子序列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序. 说明: (1)子序列的构成不是简单地“逐段分割”,而是将相隔某个增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依次取5,3,1),直到dk=1为止.由于这个原因,希尔排序也叫缩小增量排序. (2)优点:让关键字值小的元素能很快前移,且序列若基本有序时,再用直接插入排序处理,时间效率会高很多. (3)希尔排序的一个重要性质是,一个h(k)排序的文件保持它的

面对逆境学曹操,全军覆没再重来

军事斗争历来是激烈程度最高的斗争,失败和挫折像家常便饭一样,会时有发生.如果碰上精英云集的三国时代,失败就更加司空见惯了.这里不能不提曹操和刘备两位三国巨头. 曹操一生赢过很多次,重大的如官渡之战;也输过很多次,著名的如赤壁之战.可他心理素质极好,尤其是逆商极高,不论面对多大的风浪,总能毫不气馁,坦然处之,然后从头再来.所以,他的成就也最大. 拿赤壁之战来说,曹操的战舰和军营全部着火,顷刻之间,“烟炎张天”.二十万大军死的死,伤的伤,败得一塌糊涂,不仅统一江南已是不可能,就连保住性命都很难说.这

LevelDB源码分析--Iterator

我们先来参考来至使用Iterator简化代码2-TwoLevelIterator的例子,略微修改希望能帮助更加容易立即,如果有不理解请各位看客阅读原文. 下面我们再来看一个例子,我们为一个书店写程序,书店里有许多书Book,每个书架(BookShelf)上有多本书. 类结构如下所示 class Book { private: string book_name_; }; class Shelf { private: vector<Book> books_; }; 如何遍历书架上所有的书呢?一种实

Google Test测试框架分析

Google Test测试框架分析 一.简介 Google Test是由Google主导的一个开源的C++自动化测试框架,简称GTest.GTest基于xUnit单元测试体系,和CppUint类似,可以看作是JUnit.PyUnit等对C++的移植. 下图是GTest测试框架的测试过程,表示的是GTest的两种测试方式. 下面将使用一个极其简单的例子表示xUnit测试的主要过程.如对Hummer的CTXString类的成员方法GetLength进行测试.详见下面GTest代码和注释说明. //

微信支付与支付宝钱包的竞争分析

NO1: 十九世纪七十年代起,“物竞天择,适者生存,优胜劣汰”已逐渐成为现代生物学的口号.而今,不知不觉中,它似乎也成了当代社会学的口号.罗素说:“竞争一直是,甚至从人类起源起就是对大部分激烈活动的剌激物.”所谓“长江后浪推前浪”,在人类资讯的迅速积累之下,如果不能追上时代,自然就要被淘汰了.竞争,已经成了当代社会政治经济发展的重要基础与必然趋势. 从远古时期的以物换物,到后来货币的出现,直到宋朝时第一张纸币“交子”问世,随着经济的不断发展,货币的形式也在不断地变化着. 2003年10月18日,

中华英才网竞品分析报告2016

中华英才网竞品分析报告 1 背景 1.1 行业背景 1) 网民增速不断提升,移动端网民规模过半. 2016年1月22日,中国互联网络信息中心 (CNNIC)发布第37次<中国互联网络发展状况统计报告>.截至2015年12月,中国网民规模达6.88亿, 半数中国人已接入互联网. 其中,2015年新增网民3951万人,增长率为6.1%,较2014年提升1.1个百分点,网民规模增速有所提升. 图 1  2011-2018年中国整体网民数量及增长趋势 <报告>同时显示,网民的上网设备正在向

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析

[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类的3D设计软件生成的模型.因为OpenGL ES是不能直接读取这些文件的,所以常常需要开发人员增加接口来导入.通常的做法是在建模软件中建立3D模型之后在OpenGL ES中导入并进行控制.    3DS MAX通常的保存格式有*.max(现在生成的版本的格式),*.3ds(低版本的3ds Max生成的格式)

多路复用I/O分析

今天看到一个I/O性能的问题.就对这个问题思考了下. 分析阻塞.非阻塞I/O,这两种I/O一个共同点是,很多I/O中无法确认那些I/O是准备好,只能通过一个个轮询的方式,这种方式下,准备好与没有准备好的I/O均会被轮询,这种效率极其低下.异步I/O,提供了一种方式,准备好的I/O,就会发送一个信号给内核,其他时间继续进行其他的操作,这种方式一个不好的就是多个I/O同时准备好,发出的信号不好处理,不知道那个信号对应于那个描述符. 这样就思考,能不能有一种I/O呢.只考虑准备好的I/O,没准备好的I

采用[ICONIX] 方法实践分析和设计之六 [时序图](转)

采用[ICONIX] 方法实践BLOG设计之六 [时序图] 在前几篇文章中,我们分别进行了域模型和用例建模,并使用 Robustness工具进一步分析验证了相应用例的处理流程,并在相应模型(域模型)的基础上,通过Robustness方法引入相关的边界对象,控制对象(控制器),并更新了相应域模型中类的属性(字段).下面就可以进入到交互建模阶段了.如下图:    作为交互建模本身,就是要通过寻找对象之间的交互关系,进而进行方法(操作或行为)分配.    正所谓"只有在所有的用例为所有事件进程建立了交