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
  • 相关阅读:
    ubuntu下配置Apache
    ubuntu 下配置Web服务器
    ubuntu 笔记一
    域名解析
    C# Enum,Int,String的互相转换
    C# 得到本机局域网IP地址
    C# 连接 SQLServer 及操作
    C# OpenFileDialog 使用
    如何解决 IntelliJ Idea 编译 Java 项目时,找不到包或找不到符号的问题?
    阿里巴巴 MySQL 数据库之 SQL 语句规约 (三)
  • 原文地址:https://www.cnblogs.com/lovemi93/p/7485976.html
Copyright © 2011-2022 走看看