`
hao3100590
  • 浏览: 131537 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

指针与复制构造函数

阅读更多
struct Node{
  char *name;
  int age;
  Node(char *n="", int a=0){
    name = new char[strlen(n)+1];
    strcpy(name, n);
    age = a;
  }	
}

 下面声明:

Node node1("Roger", 20), node2(node1); //or node2 = node1;
注意这是对象的复制,按照道理来说,是两个相互独立的对象,赋值是互不影响的
但是实际上不是这样的,看下面赋值:
strcpy(node2.name, "Wendy");
node2.age = 30;

输出node1.name, node1.age, node2.name, node2.age
Wendy 30 Wendy 20
可以看出对象名称是一样的,年龄不一样,why?
在于Node的定义没有提供复制构造函数,编译使用自己生成的构造函数。
然后默认就是逐个成员进行复制。因为name是一个指针,所以复制构造函数
将node1.name的地址复制给了node2.name,而不是将值拷贝过去。
为了阻止,必须是在拷贝name的时候,重新分配空间并将值拷贝过去,而不是地址。

具体的过程如图:复制构造函数.bmp


 

然后写复制构造函数:
struct Node{
  char *name;
  int age;
  Node(char *n="", int a=0){
    name = new char[strlen(n)+1];
    strcpy(name, n);
    age = a;
  }	

  Node(const Node& n){
   name = new char[strlen(n.name)+1];
   strcpy(name, n.name); 
   age = n.age;
 }
}
 如果使用node2 = node1;同样会有这样的问题,那怎么办,重载操作符
Node& operator=(const Node& n){
  if(this != &n){
    if(name!= 0) delete[] name;
   name = new char[strlen(n.name)+1];
   strcpy(name, n.name); 
   age = n.age;
  }
  return *this;
}
 最后在来个析构函数:
~Node(){
  if(name!=0) delete[] name;
}
  • 大小: 8.4 KB
分享到:
评论

相关推荐

    复制构造函数

    ### 复制构造函数:深度复制与浅复制详解 在C++编程中,对象的复制是一种常见的需求,尤其是在处理复杂的类实例时。复制构造函数,作为C++中一种特殊的构造函数,专门用于创建一个对象的复制品。然而,简单地复制...

    C++复制构造函数详解

    此外,复制构造函数与默认构造函数、析构函数和赋值运算符一起构成了C++的特殊成员函数,这些函数对对象生命周期的管理起着关键作用。熟练掌握这些函数的使用,能够帮助开发者编写出更加安全、可维护的代码。

    复制构造函数引用this指针静态成员

    复制构造函数引用this指针静态成员.ppt

    C++构造函数,复制构造函数和析构函数专题[1].pdf

    在C++编程语言中,构造函数、复制构造函数和析构函数是面向对象特性的重要组成部分,它们在对象的生命周期管理中扮演着至关重要的角色。同时,继承、虚函数和多态性是C++实现面向对象设计的核心概念。下面将详细讨论...

    C++中this指针的用法

    `this`指针与复制构造函数 在复制构造函数或赋值操作符中,`this`指针的使用尤为关键,因为它帮助避免了自复制错误。例如: ```cpp class Student { private: char *name; int id; public: void copy(const ...

    C++中何时调用复制构造函数

    但大多数时候,特别是类中有指针成员的时候要实现深复制,避免浅复制时,需要自己定义复制构造函数。  那么我们定义的复制构造函数什么时候调用呢,总结起来,有如下五种情况,下面分别举例说明。  一、根据一...

    构造函数(转)

    - **定义**:虽然不是构造函数,但它与复制构造函数相似,用于将一个对象的值赋给另一个对象。 - **示例**: ```cpp class Complex { public: Complex& operator=(const Complex& rhs) { if (this == &rhs) ...

    C++数据结构与算法

     1.4.2 指针与复制构造函数  1.4.3 指针与析构函数  1.4.4 指针和引用变量  1.4.5 函数指针  1.5 多态性  1.6 C++和面向对象程序设计  1.7 标准模板库  1.7.1 容器  1.7.2 迭代器  1.7.3 算法  1.7.4 ...

    拷贝构造函数导致指针挂起的研究

    在C++中,如果一个类包含指针成员变量,并且这些指针指向动态分配的内存空间,使用默认的拷贝构造函数进行对象复制时,会导致指针挂起。具体表现为两个或多个对象的指针成员变量指向相同的内存地址,当其中一个对象...

    c++构造函数小测验

    复制构造函数在以下情况下会被调用:当一个对象通过值传递给函数时、从函数返回一个对象时、以及初始化一个新对象为一个已存在的对象时。 在Sprite类中,我们看到一个继承自Drawable类的构造函数,以及另一个接受...

    c++构造函数实例质料

    构造函数的名称与类名相同,且没有返回类型。在这个实例中,我们看到了两种不同类型的构造函数:无参数构造函数和带有参数的构造函数。 首先,让我们看看无参数构造函数。在`Student`类中,我们定义了一个名为`...

    编译器角度看C++复制构造函数

    关于复制构造函数的简单介绍,可以看我以前写过的一篇文章C++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些...

    C++构造函数详解及显式调用构造函数.doc

    默认的复制构造函数会进行浅拷贝,对于含有指针成员的类,可能存在潜在的问题,需要我们自定义深拷贝的复制构造函数以确保正确的行为。 ```cpp class Complex { public: Complex(const Complex &c) { m_real = c....

    c++类构造函数详解_.docx

    在默认情况下,复制构造函数会按成员逐个复制,但如果类中包含动态分配的内存(即指针成员),默认的复制构造函数可能导致浅拷贝问题,这时我们需要自定义复制构造函数以实现深拷贝,确保资源的正确管理。...

    c++中拷贝构造函数实例

    **知识点四:拷贝构造函数与const引用** 拷贝构造函数的参数通常是const引用,这是因为我们不想改变传递的对象。这是C++的const-correctness原则,可以防止无意修改原始对象。 **知识点五:拷贝构造函数的用途** - ...

    C++中复制构造函数与重载赋值操作符的深入分析

    默认的复制构造函数执行逐个成员的浅复制,如果类中包含指针成员,可能会导致两个对象共享同一块内存,这不是我们通常希望的行为。因此,当类中包含动态分配的资源或需要特殊处理的成员时,需要手动定义复制构造函数...

    类构造函数与析构函数

    类构造函数与析构函数 类构造函数是C++面向对象编程中的一种特殊函数,它们用于初始化类对象的成员变量。在C++中,每个类都必须有一个默认的构造函数,如果没有提供构造函数,那么C++将自动提供一个默认的构造函数...

Global site tag (gtag.js) - Google Analytics