构造、拷贝构造、赋值、析构

需要注意的问题(当数据成员函数指针型变量,需要申请空间赋值时)

1.构造函数

①需要给空指针申请一个‘\0’的空间

2.拷贝构造函数

①传入的参数,必须引用传递否则会出现无休止的拷贝构造

②对其参数值不做修改,传入的参数需要加const

③避免浅拷贝的产生,每次拷贝构造,都重新申请空间赋值。

3.赋值=

①需要返回引用型变量,否则会再返回值时,创建临时对象,又会无休止的拷贝构造

②对其参数值不做修改,传入的参数需要加const

③最重要先判断是否是给自己赋值,如果是,直接返回

④为考虑到异常安全,此时采用拷贝构造一个 参数(n) 的 临时对象(temp) ,来交换他们指针所指向的空间,在出此作用域后,临时对象就会释放。

4.析构

①如果有派生类,需要将析构函数声明为虚函数,来避免内存泄漏。

#include <iostream>
using namespace std;

class Node
{
public:
    Node(const char*str="",int a = 0):m_a(a)
    {
        if (str == NULL)
        {
            m_p = new char[1];
            m_p[0] = ‘\0‘;
        }
        else
        {
            m_p = new char[strlen(str)+1];
            strcpy(m_p, str);
            m_p[strlen(str)] = ‘\0‘;
        }
    }
    Node(const Node& n)
    {
        int len = strlen(n.m_p);
        m_p = new char[len + 1];
        strcpy(m_p,n.m_p);
        m_a = n.m_a;
    }
    Node& operator=(const Node& n)
    {
        if (this != &n)
        {
            Node temp(n);
            char* temp_str = temp.m_p;
            temp.m_p = m_p;
            m_p = temp_str;
            m_a = n.m_a;
        }
        return *this;
    }
    virtual ~Node()
    {
        delete m_p;
    }
private:
    char* m_p;
    int m_a;
};

int main()
{
    Node a("abcd",10);

    Node b(a);
    Node c;
    c = a;
}

原文地址:https://www.cnblogs.com/single-dont/p/11379488.html

时间: 2024-11-14 11:58:17

构造、拷贝构造、赋值、析构的相关文章

数据结构之二叉树 (构造 拷贝构造 以及前序中序后续三种遍历方法)

首先二叉树的节点定义如下: struct BinaryNode {                  BinaryNode *_left;                  BinaryNode *_right;                  T _data;                 BinaryNode( T data ) :_data(data), _left( NULL), _right(NULL )                 {}; }; 二叉树的结构以及接口如下 te

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现

以String类为例实现其成员函数 class String { //友元函数重载运算符 friend ostream& operator<<(ostream &out,String& str); friend istream& operator>>(istream& in, String& str); public: //通用构造函数 String(const char* str) { if(!str) //对m_data加NULL

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

赋值函数与拷贝构造的差异

C++ 拷贝构造函数 赋值构造函数 ================================= 一句话,赋值函数的前提是对象已定义:而拷贝构造是执行时才会创建一个对象.拷贝构造需要的是深拷贝. 赋值函数一般模式: type& operator =(const type& par) { // (1) 检查自赋值 if( this == &par ) return *this; // (2) 释放原有的内存资源 //(3)分配新的内存资源,并复制内容 ,2.3顺序没讲究,注意释

C++基本函数的调用优化(构造、拷贝构造、赋值)

合理的函数可提升时间和空间的利用率 //Test1.h #include<iostream> using namespace std; struct ST { private: int a; short b; public: ST(int a=0, short b=0):a(a),b(b) { this->a = a; this->b = b; cout<<"Object was Built. "<<this<<endl; }

C++之拷贝构造与拷贝赋值

拷贝构造和拷贝赋值------一个有点难的问题 介绍之前,我们需要首先了解深拷贝与浅拷贝的差异: 何为深拷贝,深拷贝不会复制指针,而是令目标对象拥有独立的资源,该资源是从元对象中复制,即先找到对象的指针,在通过指针拷贝其内容: 何为浅拷贝,即之赋值指针的地址,不会赋值指针的目标,容易引发double free异常,即多个目标指向同一个内存: 缺省拷贝构造函数和缺省拷贝赋值函数 如果一个类没有显示的定义一个拷贝构造函数和拷贝赋值运算符,则编译器会为其默认提供一个,但是这个函数只能进行浅拷贝: 如果

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

class string { public: string(const char *str=NULL); string(const string& str);     //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*

引用 拷贝构造 赋值语句

1.引用 C++中有一种新的数据类型,对已开辟空间在取一个名字: 就是别名,不开辟新的空间,没有空引用: 例:int &b; 错误, 交换两个数字用引用实现: 常见的几种引用形式: (1).对变量引用:int a = 10; int &b = a; (2).对指针引用:int *p = &a; int *&q = p; (3).对数组引用:int ar[3] = {1, 2, 3,}; int (&b)[3] = ar; 此外还有以下类型的引用: (1).常引用 c