C++构造函数及bc信用盘平台出租的学习心得

bc信用盘平台出租 Q1446595067 一些基本知识点:

构造函数:

对象生成时构造函数自动被调用,对象一旦生成,就在也不能在其上执行构造函数。
若自己定义的构造函数带参数,则声明对象时也需要带参数,缺省函数除外。

复制构造函数起作用的三种情况:

当用一个对象去初始化同类的另一个对象时 如 Test a1=a2,区别于赋值 Test a1,a2;a1=a2;
如果某函数有一个参数是类 A 的对象,那么该函数被调用时,类A的复制构造函数将被调用;
如果函数的返回值是类A的对象时,则函数返回时,A的复制构造函数被调用。

C++产生临时对象的三种情况:

类型转换;
以值的方式给函数传参(可对应上面三种情况的2);注意如果是按引用传递,则不会生成临时变量。
函数需要返回一个对象时(对应3)。

下面是一个具体实例:

#include<iostream>
#include<windows.h>
using namespace std;

class CRectangle
{
      private:
              int w,h;
              static int nTotalArea;
              static int nTotalNumber;
      public:
             CRectangle(int w_,int h_);

             ~ CRectangle();
             static void PrintTotal();
             CRectangle  AddOne();

};

CRectangle::CRectangle(int w_,int h_)
{
                           w=w_;
                           h=h_;
                           nTotalNumber ++;
                           nTotalArea +=w*h;
                           cout<<"constructor called"<<endl;
}

CRectangle::~CRectangle()
{

                         nTotalNumber --;
                         nTotalArea -=w*h;
                         cout<<"destructor called"<<endl;
}

CRectangle   CRectangle::AddOne()
{
           this->w ++;
           return *this;
}

void CRectangle::PrintTotal()
{
     cout<<nTotalNumber<<","<<nTotalArea<<endl;
}

int CRectangle::nTotalNumber=0;
int CRectangle::nTotalArea=0;

int main()
    {
        CRectangle r1(3,3),r2(2,2);
        r2=r1.AddOne();

        CRectangle::PrintTotal();
        r1.PrintTotal();  

        system("pause");
        return 0; 

    }

运行结果如下

在执行r2=r1.AddOne()时,由于AddOne函数返回对象类型,因此会调用复制构造函数生成临时的隐藏的CRectangle对象。而临时对象在消亡时会调用析构函数,减少nTotalNumber和nTotalArea的值,可是这些临时对象在生成时却没有增加它们的值,因此结果不是2,13,变成了1,1。要避免临时变量的影响,可以自己为CRectangle写一个复制构造函数,在里面改变nTotalNumber和nTotalArea的值。

CRectangle ::CRectangle(CRectangle & r)
{
           w=r.w;
           h=r.h;
           nTotalNumber ++;
           nTotalArea +=w*h;
           cout<<"copy constructor called"<<endl;
}

但是编译报错

仔细检查后发现是函数AddOne返回类型出错,与复制构造函数所需参数类型不匹配。

修改前 CRectangle CRectangle::AddOne() 修改后 CRectangle & CRectangle::AddOne()

运行结果

可以看到,并没有调用复制构造函数,这是因为AddOne函数返回类型是引用,而不是对象类型。

注意,如果修改main函数如下

int main()
    {
        CRectangle r1(3,3),r2(2,2),r3=r1.AddOne();//调用AddOne函数对r3初始化
        CRectangle::PrintTotal();
        r1.PrintTotal();
        system("pause");
        return 0;
     }

运行结果发生变化

原文地址:http://blog.51cto.com/13905067/2153538

时间: 2024-08-02 05:59:19

C++构造函数及bc信用盘平台出租的学习心得的相关文章

ArrayList原理、OA信用盘平台出租LinkedList原理和方法和迭代器注意事项

迭代器在变量元素OA信用盘平台出租QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com的时候要注意事项: 在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作. 如果使用过了集合对象改变集合中元素个数那么就会出现ConcurrentModificationException异常. 迭代元素的过程中: 迭代器创建到使用结束的时间. ------意识是迭代器一旦创建,在之后是不可以用集

Oracle数据OA信用盘平台出租远程连接的四种设置方法和注意事项

OA信用盘平台出租论坛:haozbbs.com Q1446595067 第一种情况: 若oracle服务器装在本机上,那就不多说了,连接只是用户名和密码的问题了.不过要注意环境变量%ORACLE_HOME%/network/admin/是否设置. 第二种情况: 本机未安装oracle服务器,也未安装oracle客户端.但是安装了pl sql development.toad sql development.sql navigator等管理数据库的工具.在虚拟机或者另一台电脑上安装了oracle服

使用Cmake生成OA信用盘平台出租跨平台项目编译解决方案

项目最近OA信用盘平台出租haozbbs.comQ1446595067 有需求在windows下面运行,我花了几周时间将linux的服务器移植到windows下面,目前已经能够正常运行服务器,目前又有了新需求,两边的代码结构和组织是分开的,因此为了两边能够同步维护,需要一个能够跨平台的项目编译解决方案,经过调研之后,选择了使用cmake这个工具,本文主要讲述,使用cmake的生产项目的一些基础知识.一.cmake简介 你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmak

JDK动态OA信用盘平台出租代理和cglib动态代理

一.代理设计模式OA信用盘平台出租haozbbs.com Q1446595067 代理类和委托类具有相同的接口.代理类的对象本身并不真正实现服务,而是通过委托类的对象的相关方法来提供特定的服务. 二.静态代理 见<大话设计模式>第7章 缺点: 一个代理类只能应用于一个接口的实现类,如果有多个接口的话就要定义很多实现类和代理类才行.而且,如果代理类对业务方法的预处理.调用后操作都是一样的(比如:调用前输出提示.调用后自动关闭连接),则多个代理类就会有很多的重复代码.这时我们可以定义这样一个代理类

Typescript 和 Javascript之间OA信用盘平台出租的区别

JavaScript 和 TypeScript 的概要介绍JavaScript 是一种轻量级的解释性脚本语言OA信用盘平台出租QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com,可嵌入到 HTML 页面中,在浏览器端执行,能够实现浏览器端丰富的交互功能,为用户带来流畅多样的用户体验. JavaScript 是基于对象和事件驱动的,无需特定的语言环境,只需在支持的浏览器上就能运行. JavaScript 语言具有以下特点: JavaScript

.Net4.6 Task 异步OA现金盘平台出租函数 比 同步函数 慢5倍 踩坑经历

异步Task简单介绍本标题有点 哗众取宠OA现金盘平台出租QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com ,各位都别介意(不排除个人技术能力问题) -- 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 -- 异步编程模型 .Net 4.6 给 Task 增加了好几个 特别实用的方法,而且引入了 await async 语法糖 当然,这是非常不错的技术,奈何我有自己的线程队列封装,也就没有着

Java8函数OA现金盘平台出租式编程实践精华

现在是OA现金盘平台出租haozbbs.comQ1446595067 资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享. 绪论 从java8开始,我们就可以通过java8中的StrameAPI与Lambda表达式实现函数式编程,可以让代码变得更加高效简洁. 现在很多企业的生产代码已经开始使用java8了,对于还没有使用过java8进行的编程的朋友们可以好好的学习一下,我在企业中写java8也有一段时间了,我想把我在实际开发中用到的一些场景与大家分享一下,大部分

Python属性和OA信用盘平台租用

属性有两种,类属性,实例属性.OA信用盘平台租用(企 娥:217 1793 408) 给类下所有的对象添加属性,可以添加类属性,给对象添加的实例属性,类下的其他对象,并不会获得这个属性. class Person(object):pass Person.sex = "male"#所有对象都能获得p1 = Person()p1.age = 12p2 = Person()print(p2.sex)#maleprint(p2.age)#报错AttributeError: 'Person' o

Eureka 2.X 停止开发,但注册中心OA信用盘平台制作还有更多

在上个月我们知道 Eureka 2.X 遇到困难停止OA信用盘平台制作QQ2952777280[话仙源码论坛]hxforum.com[木瓜源码论坛]papayabbs.com开发了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比: Feature euerka Consul zookeeper etcd服务健康检