【编程题】编写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 private:
 9      char *m_data;// 用于保存字符串
10 };

【解答】

 1 //普通构造函数
 2 String::String(const char *str)
 3 {
 4         if(str==NULL)
 5         {
 6                 m_data = new char[1]; // 得分点:对空字符串自动申请存放结束标志‘\0‘的//加分点:对m_data加NULL 判断
 7                 *m_data = ‘\0‘;
 8         }
 9         else
10         {
11          int length = strlen(str);
12          m_data = new char[length+1];           // 若能加 NULL 判断则更好
13          strcpy(m_data, str);
14         }
15 }
16 // String的析构函数
17 String::~String(void)
18 {
19         delete [] m_data;                       // 或delete m_data;
20 }
21 //拷贝构造函数
22 String::String(const String &other)           // 得分点:输入参数为const型
23 {
24         int length = strlen(other.m_data);
25         m_data = new char[length+1];         //加分点:对m_data加NULL 判断
26         strcpy(m_data, other.m_data);
27 }
28 //赋值函数
29 String & String::operate =(const String &other) // 得分点:输入参数为const 型
30 {
31         if(this == &other)                    //得分点:检查自赋值,&别忘了
32                 return *this;                  //*别忘了
33         delete [] m_data;                   //得分点:释放原有的内存资源
34         int length = strlen( other.m_data );
35         m_data = new char[length+1];          //加分点:对m_data加NULL 判断
36         strcpy( m_data, other.m_data );
37         return *this;                    //得分点:返回本对象的引用
38
39 }    

【分析】

1.拷贝构造函数的输入参数为何要加const引用?

  http://www.cnblogs.com/engraver-lxw/p/7580403.html

2.赋值函数的输入参数为何要加const引用,返回值为何为引用?

  http://www.cnblogs.com/engraver-lxw/p/7580598.html

——如有不对的地方,非常欢迎给予指导!

——【感谢】资料来源于http://www.cnblogs.com/stoneJin/archive/2011/11/01/2231358.html

时间: 2024-10-06 08:34:40

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

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

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数). class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operate =(const String &other); // 赋值函数 // 相加函数,如果没

编写类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++构造函数 & 拷贝构造函数 & 派生类的构造函数 & 虚继承的构造函数

构造函数 ,是一种特殊的方法 .主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 .特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载.(摘自百度百科构造函数). 一.最基本的构造函数 1 class Base 2 { 3 public: 4 Base(int var) : m_Var(var) 5 { 6 } 7 private: 8 int m_Var; 9 }; 以上构造函数的执行过程:

《C++编程思想》 第十章 引用和拷贝构造函数(知识点+习题+解答)

一.相关知识点 使用引用时有一定的规则: 1) 当引用被创建时,它必须被初始化.(指针则可以在任何时候被初始化.) 2) 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用.(指针则可以在任何时候指向另一个对象.) 3) 不可能有NULL引用.必须确保引用是和一块合法的存储单元关连. 仅当准备用传值的方式传递类对象时,才需要拷贝构造函数.如果不需要这么做,就不要拷贝构造函数. 对于指向一个对象的指针新的语法变为 ->*,对于一个对象或引用则为.*. 二.相关代码 1. /*R

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

看下面一个表示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

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(){

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

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

string类的深浅拷贝问题

字符串是我们在编写程序的时候经常用的到的.C++库已经帮我们实现了一个功能更加强大的字符串类string,我们要去了解它是怎么实现的. 只要是涉及到 string类的地方多少都会涉及到深浅拷贝的问题.在C++中,在用一个对象初始化另一个对象时,只复制了成员,并没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制.       深拷贝是将指向内容复制到给当前对象新分配的缓冲区中的一种复制方式.     下面就是自己实现的深拷贝string类: #include<iostream> #i

C++11之右值引用(三):使用C++11编写string类以及&ldquo;异常安全&rdquo;的=运算符

前面两节,说明了右值引用和它的作用.下面通过一个string类的编写,来说明右值引用的使用. 相对于C++98,主要是多了移动构造函数和移动赋值运算符. 先给出一个简要的声明: class String { public: String(); String(const char *s); //转化语义 String(const String &s); String(String &&s); ~String(); String &operator=(const String