在剑指offer上看到的经典错误,以供大家学习

class A
{private:int value;
public:
    A(int n){value=n;
    }
    A(int other){value=other.value;
    }
    void print(){cout<<value<<endl;
    }
};
int tmain(int argc,TCHAR*argv[]){
    A a=10;
    A b=a;
    b.print();

    return 0;
}

A(int other){value=other.value;} 这是复制构造函数,但参数类型错误。正确的应该是A(const A& other){value=other.value;}

  1. A(int other){value=other.value;}

这个函数实际上不是一个复制构造函数。它是一个接受 int 类型参数的普通构造函数。但是,它的实现是有问题的,因为 int 类型没有 value 成员。

  1. A(const A& other){value=other.value;}

这才是真正的复制构造函数。让我们来看看它们的区别:

  1. 参数类型:
    • 第一个函数接受一个 int 类型的参数。
    • 第二个函数接受一个 const A& 类型的参数,即 A 类的常量引用。
  2. 功能:
    • 第一个函数试图从一个整数创建一个新的 A 对象,但实现是错误的。
    • 第二个函数正确地从一个已存在的 A 对象创建一个新的 A 对象。
  3. 使用场景:
    • 第一个函数会在尝试用一个整数初始化 A 类对象时被调用,例如 A a = 5;
    • 第二个函数会在需要复制一个 A 类对象时被调用,例如 A b = a; 或者将 A 类对象作为参数传递给函数时。
  4. 正确性:
    • 第一个函数的实现是错误的,因为 int 类型没有 value 成员。
    • 第二个函数正确地复制了其他 A 对象的 value 成员。
  5. const 关键字:
    • 第二个函数使用 const 关键字,这意味着它不会修改被复制的对象,这是一个好的实践。

上面的代码

#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(int argc, char* argv[])
{
    A a(10);  // 使用圆括号而不是等号来调用构造函数
    A b = a;
    b.print();
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值