引用和拷贝构造函数 --C++编程思想

1. C和C++指针最重要的区别
       C++类型要求更强,void* 不可以赋值给其他指针,可以通过强制类型转换完成;C则可以。
2. 使用引用的规则
        任何引用都要和存储单元关联
        当引用被创建时,必须初始化(指针可以在任意时候被初始化)
        一旦一个引用被初始化为指向一个对象,它就不能改为另一个对象的引用(指针则可以在任何时候指向另一个对象)
        不可能NULL引用。必须确保引用是和一块合法的存储单元联系
        当函数返回时,无论引用关联的是什么都应该存在,否则,将不知道指向哪个内存
3.需要使用拷贝构造函数的情况

 程序中需要新建立一个对象,并用另一个同类的对象对它初始化,如前面介绍的那样。

 当函数的参数为类的对象时。在调用函数时需要将实参对象完整地传递给形参,也就是需要建立一个实参的拷贝,这就是按实参复制一个形参,系统是通过调用复制构造函数来实现的,这样能保证形参具有和实参完全相同的值。

 函数的返回值是类的对象。在函数调用完毕将返回值带回函数调用处时。此时需要将函数中的对象复制一个临时对象并传给该函数的调用处。

#include<iostream>
#include<string>
#include<fstream>
#include<cassert>
using namespace std;
ofstream out("howmany.out");
class HowMany{
        static int objectcount;
public:
       HowMany(){objectcount++;print( "HowMany()");}
        static void print(const string &msg = "");
       ~HowMany(){objectcount--;print( "~HowMany()");}
};
void HowMany::print(const string &msg)
{
        if(msg.size() !=0){
              out << msg << ":"
                     << "objectcount = " << objectcount << endl;
       }
}
int HowMany::objectcount = 0;
HowMany f(HowMany x) //通过按值传递的方式传入的对象的拷贝,return也是位拷贝;通过位拷贝创建一个对象,并没有调用构造函数,当对象离开作用域时
{                    //析构函数被自动调用,也叫是说通过默认的位拷贝方式创建一个自定义类型是不行的。
       x.print( "x argument inside f()");
        return x;
}
int main()    //拷贝构造函数提供了介入位拷贝的过程,并防止编译器进行位拷贝;每当编译器从现有的对象创建新对象的时候,可以通过自己定义拷贝构造函数来实现。
{
       HowMany h;
       h.print( "after construction of h");
       HowMany h2 = f(h);
       HowMany::print( "after call of f()");
        return 0;
}
HowMany():objectcount = 1
after construction of h:objectcount = 1
x argument inside f():objectcount = 1
~HowMany():objectcount = 0
after call of f():objectcount = 0
~HowMany():objectcount = -1
~HowMany():objectcount = -2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值