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
分享到:
相关推荐
复制构造函数引用this指针静态成员.ppt
但大多数时候,特别是类中有指针成员的时候要实现深复制,避免浅复制时,需要自己定义复制构造函数。 那么我们定义的复制构造函数什么时候调用呢,总结起来,有如下五种情况,下面分别举例说明。 一、根据一...
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++复制控制之复制构造函数该文章中介绍了复制构造函数的定义、调用时机、也对编译器合成的复制构造函数行为做了简单说明。本文因需要会涉及到上文的一些...
如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下: classname (const classname &obj) { // 构造函数的主体 } 在这里,obj 是一个对象引用,该对象是用于初始化...
假设基类使用了动态内存分配,而且定义了析构函数、复制构造函数和赋值函数,但是在派生类中没有使用动态内存分配,那么在派生类中不需要显示定义析构函数、复制构造函数和赋值函数。 当基类和派生类采用动态内存...
使用new初始化对象中的指针成员时遇到的问题 在构造函数中使用new初始化指针成员,那么析构函数中就必须使delete,并且...需要自行定义一个复制构造函数和赋值构造函数,用深复制的方式把一个对象初始化给另一个对象,
在C++中复制控制是一个比较重要的话题,主要包括复制构造函数、重载赋值操作符、析构函数这三部分,这三个函数是一致的,如果需要手动定义了其中了一个,那么另外的两个也需要定义,通常在存在指针或者前期相关操作...
C++ 拷贝构造函数 double*指针成员
介绍:本文辑是对C++中的部分难点专题进行分章的专门讲解,不是一套完整的教材,但可以做...C++构造函数,复制构造函数和析构函数专题 C++的String类及其成员函数和智能指针专题 C++的IO(输入输出)专题 C++操作符重载专题
面向对象程序设计,即c++语言。类,函数的形参、返回值为不同情况时,复制构造函数的调用。内有详细的注释说明。
第28讲 默认构造函数和复制构造函数 第29讲 析构函数 第30讲 对象数组和对象指针 第31讲 类作用域、对象生命期、const限定 第32讲 静态成员和友元 第33讲 类的继承与派生 第34讲 派生类成员的访问 第35讲 派生类的...
友元函数可以访问类的公有、受保护以及私有成员,但是必须通过对象、对象指针或者对象引用来访问。 2.友元函数的声明: friend 返回值类型 函数名(参数表); 在类中只需要将这个声明放置在公有部分即可。 class ...
当然,同样的策略也适⽤于复制构造函数。每种⽅法都有其⽤途。 auto_ptr和unique_ptr: 上⾯也提到了,⽆论是auto_ptr还是unique_ptr,都是基于所有权的概念去解决可能出现的删除⼀个对象两次的问题的。这种情况...
内容包括:C++整型、字符型、浮点型、声明、定义、typedef、运算符、表达式、左值、选择语句、循环语句、指针、数组、函数和标识符的作用域、类基础、类作用域及相关运算符、构造函数、复制构造函数、析构函数、名称...
10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数中实现自加 11.3 重载前置自加运算符 11.4 创建临时对象 11.5 创建无名临时对象 11.6 取消创建临时对象 11.7 重载...
10.5 浅层复制构造函数 10.6 深层复制构造函数 第11章 运算符重载 11.1 运算符重载 11.2 在成员函数中实现自加 11.3 重载前置自加运算符 11.4 创建临时对象 11.5 创建无名临时对象 11.6 取消创建临时对象 ...
10.13章 复制构造函数和赋值操作符 11.13章 析构函数 12.13章 深复制、浅复制 13.13章 管理指针成员 14.14章 重载操作符的定义 15.14章 重载输入输出操作符 16.14章 重载算术操作符 17.14章 重载关系...
public成员包括构造函数、析构函数、复制构造函数和=重载函数以及其它的成员函数,主要有length()(求栈长度)、empty()(判断栈是否为空)、clear()(清空栈)、traver()(遍历栈)、push_stack(入栈函数)、top_...
C++基础教程之指针拷贝详解 指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此。特别是在C++中,如果不注意处理类中的指针,非常容易出问题。如果朋友们不相信可以看看下面的代码: class ...