剑指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;
}

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;
}

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;
}

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

6:const关键字修饰变量或者函数时,其意思通常是“只读”。比如,当const修饰变量时,变量的值不能改变,当

时间: 2024-10-22 04:39:04

剑指offer:关于复制构造函数的相关文章

【剑指offer】复制的复杂链条

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描写叙述: 输入一个复杂链表(每一个节点中有节点值,以及两个指针,一个指向下一个节点,还有一个特殊指针指向随意一个节点). 输入: 输入可能包括多个測试例子,输入以EOF结束.对于每一个測试案例.输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1開始).接下来有n个数,表示链表节点中的值. 接下来有n个数Ti,Ti表示第

【剑指offer】复杂链表的复制

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26154691 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一行为一个整数n (1<=n<=1000):n代表将要输入的链表元素的个数.(节点编号从1开始).接下来有n个数,表示链表节点中的值.接下来有n个数Ti,Ti表示第i个节点的另

剑指offer之【复杂链表的复制】

题目: 复杂链表的复制 链接: https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为

剑指offer (27) 复杂链表的复制

题目:请实现一个函数,复制一个复杂链表,在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点,还有一个m_pSibling指向链表中的任意节点或者NULL struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; 方法一: step1. 复制原始链表的每一个节点,并用m_pNext链接起来 step2. 设置每个结点的m_pSibling指针 由于m

【Java】 剑指offer(35) 复杂链表的复制

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表.在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr. 思路 思路1:先复制结点,用next链接,最后根据原始结点的sibling指针确定该sibling结点距离头结点的位

剑指offer 25. 分解让复杂问题简单 复杂链表的复制

题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解题思路 package jianzhioffer.linkedlist; import com.sun.org.apache.xalan.internal.xsltc.dom.ClonedNodeListIterator; /** * @author hadoop */

牛客网上的剑指offer题目

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目:请实现一个函数,将一个字符串中的空格替换成"%20" 两种方法实现:输入一个链表,从尾到头打印链表每个节点的值 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 剑指offer 斐波那契数列 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个

剑指offer (36) 数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面一个数字,则这两个数字组成一个逆序对 题解分析: 首先应该想到很简单的一种解法,顺序遍历数组,对每个数,逐个比较该数字和其以后的数字,T(n) = O(n^2) (1)总体的意思就是将数组分成两段,首先求段内的逆序对数量,比如下面两段代码就是求左右两端数组段内的逆序对数量 count += Merge(data, temp, first, mid);//找左半段的逆序对数目 count += Merge(data, temp, mid + 1, e

【剑指offer】字符串的排列

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26390551 题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个测试案例包括1行. 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母. 输出: 对应每组数据,按字典序输出所有排列. 样例输入: abc BCA 样例输出:

剑指offer (49) 字符串转数字

class Test { public: Test() : n2(0), n1(n2 + 2) { } private: int n1; int n2; }; 调用构造函数之后,n1个n2各为多少? 分析:构造函数的初始化顺序仅仅取决于成员变量的声明顺序,所以这是 应该是 n1先初始化,然后是n2初始化 当n1初始化值 = n2值 + 2,此时n2并没有初始化,n2为内置类型并且是non-static,所以n2此时为随机值 故 n1 为随机值,n1初始完之后,n2初始化为0 最终 n1为随机值,