使用new分配内存的类需要自己定义拷贝构造函数

13.22 假定我们希望HasPtr的行为像一个值。即,对于对象所指向的string成员,每个对象都有一份自己的拷贝。

#include<iostream>
#include<string>
#include<new>

using namespace std;
class HasPtr
{
public:
    HasPtr(const string &s=string()):ps(new string(s)),i(0){cout<<"constructer"<<endl;}
    HasPtr(const HasPtr &h):i(h.i)
    {
        cout<<"copy constructer"<<endl;
        ps=new string;
        *ps=*h.ps;//只拷贝值
    }
    HasPtr& operator=(const HasPtr &h)
    {
        auto newp=new string(*h.ps);
        delete ps;
        ps=newp;
        i=h.i;
        return *this;
    }
    ~HasPtr() {  delete ps; cout<<"destructer"<<endl;}
private:
    string *ps;
    int i;
};
int main()
{
    HasPtr h;
    HasPtr hh(h);
    hh=h;
    return 0;
}

使用new分配内存的类需要自己定义拷贝构造函数,布布扣,bubuko.com

时间: 2024-10-20 20:58:10

使用new分配内存的类需要自己定义拷贝构造函数的相关文章

类的赋值运算符和拷贝构造函数

#include<stdio.h> class A { private: const A& operator=(const A&); }; int main() { A a; A b = a;//ok,实际上是A b(a),即调用拷贝构造函数 A c; c = a;//error,因为'='已被声明为私有 return 0; }

深入探索C++对象象模型--拷贝构造函数 &amp;&amp;多重继承 虚拟继承 内存分布

拷贝构造函数 如果没有定义拷贝构造函数,那么编译器会自动生成一个拷贝构造函数,但是这个拷贝构造函数是有一定限度的. 一般来说这个拷贝构造函数是按照位直接拷贝的,但是在有些情况下这种初始化是有问题的,在特殊的四种情况下是有问题的,在有问题的情况下,可以举例说明. 如果一个有多态性质的对象,子类赋值给父类,调用了拷贝构造函数,这个时候就需要给父类的虚拟函数表重新分配,使得虚拟函数表和子类不是同一个,这样bitwist就不能有效 对于在函数参数中调用拷贝构造函数,参数是实参的一根拷贝,对于函数的返回值

C++类对象的拷贝构造函数分析

对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a=100;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. #include <iostream>using namespace std;class CA{ public: CA(int b) { a=b; } void Show () { cout<<a<<endl; } private: int a;};int main(){

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员)、拷贝构造函数

C++ Primer 学习笔记_19_类与数据抽象(5)_初始化列表(const和引用成员).拷贝构造函数  从概念上将,可以认为构造函数分为两个阶段执行: 1)初始化阶段: 2)普通的计算阶段.计算阶段由构造函数函数体中的所有语句组成. 一.构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 1.对象成员及其初始化 <span style="font-size:14px;">#include <iostream> using namespace std;

C++类对象的复制-拷贝构造函数

在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如: int a = 10; int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如: #include <iostream>  using namespace std;    class Test  {  public:      Test(int temp)      {          p1=temp;      }  prote

string类的写时拷贝

由于浅拷贝使多个对象共用一块内存地址,调用析构函数时导致一块内存被多次释放,导致程序奔溃. 实现string类的时候通常显示的定义拷贝构造函数和运算符重载函数. 由于释放内存空间,开辟内存空间时花费时间,因此,在我们在不需要写,只是读的时候就可以不用新开辟内存空间,就用浅拷贝的方式创建对象,当我们需要写的时候才去新开辟内存空间.这种方法就是写时拷贝. 在构造函数中开辟新的空间时多开辟4个字节的空间,用来存放引用计数器,记录这快空间的引用次数. [cpp] view plain copy #inc

javascript类的简单定义

在面向对象编程中,类(class)是对象(object)的模板,定义了同一组对象(又称"实例")共有的属性和方法. Javascript语言不支持"类",但是可以用一些变通的方法,模拟出"类". 一.构造函数法 这是经典方法,也是教科书必教的方法.它用构造函数模拟"类",在其内部用this关键字指代实例对象. function Cat() { this.name = "大毛"; } 生成实例的时候,使用ne

组合类、派生类 拷贝构造函数

在派生类中如何写拷贝构造函数 一种形式:派生类拷贝构造函数名(对象p的引用):基类构造函数名(参数列表) 如:student::student(student&p):stud(p.num,p.name,p.sex) //注意,参数形式,是对象的引用,我们知道引用是C++特有的,这又是一个引用的用法 呵呵 一种形式:派生类拷贝构造函数名(对象p的引用):基类拷贝构造函数名(p) 如:student::student(student &p):stud( p) 注意:在调用基类的构造函数时或拷贝

c++类的拷贝、赋值与销毁(拷贝构造函数、拷贝赋值运算符析构函数)

拷贝构造函数     如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. 拷贝构造函数第一个参数必须是一个引用类型.此参数几乎总是一个const的引用.拷贝构造函数在几种情况下都会被隐式地使用.因此,拷贝构造函数通常不应该是explicit的. 合成拷贝构造函数 与合成默认构造函数不同,即使我们定义了其他构造函数,编译器也会为我们合成一个拷贝构造函数. 对某些类来说,合成拷贝构造函数用来阻止我们拷贝该类类型的对象.而一般情况,合成的拷贝构造函数