zoukankan      html  css  js  c++  java
  • 剑指offer 复制构造函数

    复制构造函数:

     A(const A &other){value=other.value;} 也就是传值参数改为常量引用。

    #include<iostream>
    using namespace std;
    class A
    {
        private:
            int value;
        public:
            A(int n){value=n;}
            A(const A &other){value=other.value;}
            void print(){
                cout<<value<<endl;
            }
    };
    int main()
    {
        A a=10;
        A b=a;
        b.print();
        return 0;
    }

     值得说明的地方:

    类是将数据成员和进行于其上的一系列操作(成员函数)封装在一起。注意:成员函数可以操作数据成员(可以称类中的数据成员为泛数据成员)!  

      对象是类的实例化,怎样理解实例化?其实每一个实例对象都只是对其中的数据成员初始化,内存映像中每个对象仅仅保留属于自己的那份数据成员副本。而成员函数对于整个类而言却是共享的,即一个类只保留一份成员函数。

      那么每个对象怎样和这些可以认为是“分离”的成员函数发生联系,即成员函数如何操作对象的数据成员?记住this指针,无论对象通过(.)操作或者(->)操作调用成员函数。编译时刻,编译器都会将这种调用转换成我们常见的全局函数的形式,并且多出一个参数(一般这个参数放在第一个,有点像python中类中函数声明中的self参数),然后将this指针传入这个参数。于是就完成了对象与成员函数的绑定(或联系)。

      实例化后就得到同一个类的多个不同的对象,既然成员函数共享的,那么成员函数就可以操作对象的数据成员。

      问题是现在有多个对象,成员函数需要知道操作的是哪个对象的数据成员?比如有对象obj1和obj2,都属于A类,A类有public成员函数foo()。如果obj1调用该函数,编译时会给foo函数传入this指针,obj1.foo中操作obj1自身的成员就不用任何修饰,直接访问,因为其中的数据成员自动根据this指针找到。

      如果obj1调用该函数,同样可以访问同类的其他对象的数据成员!那么你需要做的是让foo函数知道是同类对象中哪个对象的数据成员,一个解决办法是传入同类其他对象的指针或引用,那么就可以操作同类其他对象的数据成员。

      foo(A& obj)

      这样定义,然后调用:

      obj1.foo(obj2)

      就可以在obj1访问obj2的数据成员,而无论这些数据成员是private还是protected

    复制构造函数处理静态变量:

    class Rect
    {
    public:
        Rect()      // 构造函数,计数器加1
        {
            count++;
        }
        ~Rect()     // 析构函数,计数器减1
        {
            count--;
        }
        static int getCount()       // 返回计数器的值
        {
            return count;
        }
    private:
        int width;
        int height;
        static int count;       // 一静态成员做为计数器
    };
    
    int Rect::count = 0;        // 初始化计数器
    
    int main()
    {
        Rect rect1;
        cout << "The count of Rect: " << Rect::getCount() << endl;
    
        Rect rect2(rect1);   // 使用rect1复制rect2,此时应该有两个对象
        cout << "The count of Rect: " << Rect::getCount() << endl;
    
        return 0;
    }

    程序的输出结果都是count = 1,这明显跟我们的期望值(应该是2)不一样。具体原因在于我们没有定制拷贝构造函数,而是由编译器帮我们自动生成一个默认拷贝函数:

    显然这里并没有处理静态成员变量count,所以我们需要定制拷贝构造函数:

    1 Rect(const Rect& orig)   // 拷贝构造函数
    2 {
    3     width = orig.width;
    4     height = orig.height;
    5     count++;             // 计数器加1
    6 }
  • 相关阅读:
    HiveServer2的配置使用
    hBase-thrift 实践(java)
    Building Apache Thrift on CentOS 6.5
    linux安装thrift
    Apache Thrift with Java Quickstart(thrift入门及Java实例)
    [转载]/etc/security/limits.conf解释及应用
    storm 入门原理介绍
    Storm的wordCounter计数器详解
    CentOS6.5 安装python
    HBase 协处理器统计行数
  • 原文地址:https://www.cnblogs.com/wft1990/p/6172197.html
Copyright © 2011-2022 走看看