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

    1:首先参看代码:

    #include "stdafx.h"
    #include "iostream"
    using namespace std;
    class A
    {
    private:
        int value;
    public:
        A(int n)
        {
            value=n;
        }
    
        //A(A other)!!这是错误的
        // 复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
        // 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险
        A(const A& other)//定义自己的复制构造函数都是如此格式
        {
            value=other.value;
        }
    
        void Print()
        {
            std::cout<<value<<std::endl;
        }
    };
    int main(int argc, char* argv[])
    {
        
        A a=10;
        A b=a;
        b.Print();
        return 0;
    }
    View Code

    2:分析之自己定义复制构造函数的格式为:A(const A& other);

    3:注意一个问题:主函数中用的语句是:A a=10;正常情况下应该为:A a(10);,因为类中只有一个成员变量,所以上列代码可行。应该改为如下代码:

    #include "stdafx.h"
    #include "iostream"
    using namespace std;
    class A
    {
    private:
        int value;
    public:
        A(int n)
        {
            value=n;
        }
    
        //A(A other)!!这是错误的
        // 复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
        // 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险
        A(const A& other)//定义自己的复制构造函数都是如此格式
        {
            value=other.value;
        }
    
        void Print()
        {
            std::cout<<value<<std::endl;
        }
    };
    int main(int argc, char* argv[])
    {
        
        A a(10);
        A b=a;
        b.Print();
        return 0;
    }
    View Code

    4:下面研究如何复制一个对象。复制构造函数正常的格式为:A(A &other);,自定义复制构造函数的格式为:类名(类名 &形参),因此正常情况下代码如下:

    #include "stdafx.h"
    #include "iostream"
    using namespace std;
    class A
    {
    private:
        int value;
    public:
        A(int n)
        {
            value=n;
        }
    
        //A(A other)!!这是错误的
        // 复制构造函数参数为类对象本身的引用,用于根据一个已存在的对象复制出一个新的该类的对象,一般在函数中会将已存在对象的数据成员的值复制一份到新创建的对象中
        // 若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统默认创建该复制构造函数会存在风险
        A(A &other)//定义自己的复制构造函数都是如此格式
        {
            value=other.value;
        }
    
        void Print()
        {
            std::cout<<value<<std::endl;
        }
    };
    int main(int argc, char* argv[])
    {
        
        A a(10);
        A b=a;
        b.Print();
        return 0;
    }
    View Code

    5:但是程序中加入了一个const,这个知识点可以参考const对象。当创建一个对象后,如果不希望它的任何数据发生改变,可以将其直接声明为const对象。

    6:const关键字修饰变量或者函数时,其意思通常是“只读”。比如,当const修饰变量时,变量的值不能改变,当const关键字修饰变量时,变量的值不能改,当const关键字修饰类成员函数时,此函数不能更改类中的数据成员的值。如下面的小例子所示:

    #include "stdafx.h"
    #include "iostream"
    using namespace std;
    
    void print(const int & a)
    {
        //a=100;//错误,因为试图修改常引用参数的值
        cout<<a<<endl;
    }
    int main(int argc, char* argv[])
    {
        int x=1;
        print(x);
        return 0;
    }
    View Code
  • 相关阅读:
    我所理解的三次握手
    网络舆情——初步了解
    【转载】位运算的密码
    【转载】基础排序算法简介
    【原创】关于hashcode和equals的不同实现对HashMap和HashSet集合类的影响的探究
    【原创】Java移位运算
    【原创】MapReduce计数器
    【原创】Hadoop机架感知对性能调优的理解
    【原创】一个复制本地文件到Hadoop文件系统的实例
    【转载】JAVA IO 流的总结
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7485976.html
Copyright © 2011-2022 走看看