类String的构造函数(包含一个拷贝构造函数)、析构函数和赋值函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。

class String
    {
      public:
        String(const char *str = NULL);    // 普通构造函数
        String(const String &other);        // 拷贝构造函数
        ~ String(void);                        // 析构函数
        String & operate =(const String &other);    // 赋值函数

        // 相加函数,如果没有friend修饰则只许有一个右侧参数
        friend    String   operate+( const String &s1, const String &s2);

      private:
        char      *m_data;                // 用于保存字符串
    };
// String的析构函数
    String::~String(void)               // 3分
{
    delete [] m_data;
// 由于m_data是内部数据类型,也可以写成 delete m_data;
    }

    // String的普通构造函数
    String::String(const char *str)      // 6分
{
    if(str==NULL)
    {
        m_data = new char[1];    // 若能加 NULL 判断则更好
        *m_data = ‘\0’;
    }
    else
    {
        int length = strlen(str);
        m_data = new char[length+1];  // 若能加 NULL 判断则更好
        strcpy(m_data, str);
    }
}
// 拷贝构造函数
    String::String(const String &other)   // 3分
    {
    int length = strlen(other.m_data);
    m_data = new char[length+1];      // 若能加 NULL 判断则更好
    strcpy(m_data, other.m_data);
}
// 赋值函数
    String & String::operate =(const String &other)    // 13分
    {
        // (1) 检查自赋值                     // 4分
        if(this == &other)
            return *this;

// (2) 释放原有的内存资源            // 3分
        delete [] m_data;

        // (3)分配新的内存资源,并复制内容 // 3分
    int length = strlen(other.m_data);
    m_data = new char[length+1];         // 若能加 NULL 判断则更好
        strcpy(m_data, other.m_data);

        // (4)返回本对象的引用            // 3分
        return *this;
}    

对于赋值函数,应当用“引用传递”的方式返回String对象。如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把 *this拷贝到保存返回值的外部存储单元之中,增加了不必要的开销,降低了赋值函数的效率。例如:
String a,b,c;

a = b; // 如果用“值传递”,将产生一次 *this 拷贝
a = b = c; // 如果用“值传递”,将产生两次 *this 拷贝

String的相加函数operate + 的实现如下:

String operate+(const String &s1, const String &s2)
{
String temp;
delete temp.data;    // temp.data是仅含‘\0’的字符串
temp.data = new char[strlen(s1.data) + strlen(s2.data) +1];
strcpy(temp.data, s1.data);
strcat(temp.data, s2.data);
return temp;
}

对于相加函数,应当用“值传递”的方式返回String对象。如果改用“引用传递”,那么函数返回值是一个指向局部对象temp的“引用”。由于temp在函数结束时被自动销毁,将导致返回的“引用”无效。例如:
c = a + b;
此时 a + b 并不返回期望值,c什么也得不到,流下了隐患。

时间: 2024-12-20 07:06:06

类String的构造函数(包含一个拷贝构造函数)、析构函数和赋值函数的相关文章

类的构造函数、析构函数与赋值函数

构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易 麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝 构造函数,其它的称为普通构造函数).对于任意一个类 A,如果不想编写上述函数, C++编译器将自动为 A 产生四个缺省的函数. 1 #include <iostream> 2 3 /* run this program using the console pauser or add y

条款十一: 为需要动态分配内存的类声明一个拷贝构造函数和一个拷贝赋值运算符

看下面一个表示string对象的类: // 一个很简单的string类 class string { public: string(const char *value); ~string(); ... // 没有拷贝构造函数和operator= private: char *data; }; string::string(const char *value) { if (value) { data = new char[strlen(value) + 1]; strcpy(data, value

【编程题】编写String类的构造函数、拷贝构造函数、析构函数和赋值函数

[编程题]编写String类的构造函数.拷贝构造函数.析构函数和赋值函数 [题目]:请编写如下4个函数 1 class String 2 { 3 public: 4 String(const char *str = NULL);// 普通构造函数 5 String(const String &other); // 拷贝构造函数 6 ~ String(void); // 析构函数 7 String & operate =(const String &other);// 赋值函数 8

编写类String 的构造函数、析构函数和赋值函数

编写类String 的构造函数.析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造函数String(const String &other); // 拷贝构造函数~ String(void); // 析构函数String & operate =(const String &other); // 赋值函数private:char *m_data; // 用于保存字符串

【c语言】为下面的函数原型编写函数定义,这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。

/*为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数. 如果字符串参数包含了任何非数字字符,函数就返回零.请不必担心算数溢出. 提示:这个技巧很简单:你每发现一个数字,把当前值乘以10,并把这个值和新的数字所代表的值相加*/ #include <stdio.h> int ascii_to_integer(char const *str) { int sum =

【C语言】为下面的函数原型编写函数定义: int ascii_to_integer(char *str); 这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数。

/*<p>为下面的函数原型编写函数定义:</p><p>int ascii_to_integer(char *str);</p><p>这个字符串参数必须包含一个或者多个数字,函数应该把这些数字字符转换为整数并返回这个整数.</p><p><span style="font-family: Arial, Helvetica, sans-serif;">如果字符串参数包含了任何非数字字符,函数就返回

类和对象(7)—— 拷贝构造函数应用场景

#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; class Test { public: //显示的无参数的构造函数 Test() { cout << "Test()..." << endl; m_x = 0; m_y = 0; } //显式地有参数的构造函数 Test(int x, int y) { cout << "Test(i

C++构造函数语意学——默认拷贝构造函数

概述 使用 class object 时,在以下三种情况会以一个 object 的内容作为另一个 class object 的初值,即用到拷贝构造函数: 定义一个 class object 并对其进行初始化: class object 作为一个参数传递给函数: class object 作为函数的返回值: 若用户没有显示声明或定义拷贝构造函数,则 C++ 在 必要 时为 class 声明或定义隐式拷贝构造函数,若出现以下的情况时,该拷贝构造函数是 trivial 的: their class h

c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数).对于任意一个类A,如果不编写上述函数,C++编译器将自动为A 产生四个缺省的函数,例如: A(void);//缺省的无参数构造函数 A(const A&a);//缺省的拷贝构造函数 -A();//缺省的析构函数 A&operator=(const A &a);//缺省的赋值构造函数 1).“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘