https://www.cnblogs.com/alinh/p/9636500.html

考点:构造函数、析构函数和赋值函数的编写方法
出现频率:☆☆☆☆☆
已知类String的原型为:
        class String
        {
        public:
                String(const char *str = NULL);     //普通构造函数
                String(const String &other);        //拷贝构造函数
                ~ String(void);                    //析构函数
                String & operator =(const String &other); //赋值函数
        private:
                char *m_String;                  //私有成员,保存字符串
        };
解析:
程序代码如下:
        #include <iostream>
        using namespace std;
        class String
        {
        public:
                String(const char *str = NULL);          //普通构造函数
                String(const String &other);             //拷贝构造函数
                ~ String(void);                         //析构函数
                String & operator =(const String &other);  //赋值函数
        private:
                char *m_String;    //私有成员,保存字符串
        };
        
        String::~String(void)             
        {
                cout << "Destructing"<< endl;
                if (m_String != NULL)                  //如果m_String不为NULL,释放堆内存
                {
                        delete [] m_String;
                        m_String = NULL;                //释放后置为NULL
                }
        }
        
        String::String(const char *str)      
        {
                cout << "Construcing" << endl; 
                if(str == NULL)                        //如果str为NULL,存空字符串""
                {
                        m_String = new char[1];            //分配一个字节
                        *m_String = '\0';                   //将之赋值为字符串结束符
                }     
                else
                {
                        m_String = new char[strlen(str) + 1]; //分配空间容纳str内容
                        strcpy(m_String, str);              //拷贝str到私有成员
                }
        }
        
        String::String(const String &other)  
        {
                cout << "Constructing Copy" << endl;
                m_String = new char[strlen(other.m_String) + 1];  //分配空间容纳str内容
                strcpy(m_String, other.m_String);               //拷贝str到私有成员
        }
        
        String & String:perator = (const String &other)   
        {
                cout << "Operate = Function" << endl; 
                if(this == &other)             //如果对象与other是同一个对象
                {                           //直接返回本身
                        return *this;
                }
                delete [] m_String;           //释放堆内存
                m_String = new char[strlen(other.m_String)+1];         
                strcpy(m_String, other.m_String);
        
                return *this;
        }
        
        int main()
        {
                String a("hello");            //调用普通构造函数
                String b("world");           //调用普通构造函数
                String c(a);                //调用拷贝构造函数
                c = b;                     //调用赋值函数
        
                return 0;
        }
(1)普通构造函数:这里判断了传入的参数是否为NULL。如果是NULL,初始化一个字节的空字符串(包括结束符'\0');如果不是,分配足够大小长度的堆内存保存字符串。
(2)拷贝构造函数:只是分配足够小长度的堆内存保存字符串。
(3)析构函数:如果类私有成员m_String不为NULL,释放m_String指向的堆内存,并且为了避免产生野指针,将m_String赋为NULL。
(4)赋值函数:首先判断当前对象与引用传递对象是否是同一个对象,如果是,不做操作直接返回;否则先释放当前对象的堆内存,然后分配足够大小长度的堆内存拷贝字符串。
程序的执行结果如下:
        Construcing
        Construcing
        Construcing Copy
        Operate = Function
        Destructing
        Destructing
        Destructing
这里代码第63~66行会发生构造函数以及赋值函数的调用,而析构函数的调用发生在main()函数退出时

C/C++面试题:编写类String的构造函数、析构函数和赋值函数。的更多相关文章

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

    编写类String 的构造函数.析构函数和赋值函数,已知类String 的原型为:class String{public:String(const char *str = NULL); // 普通构造 ...

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

    已知类String的原型为: class String {   public:  String(const char *str = NULL); // 普通构造函数  String(const Str ...

  3. 编写类String的构造函数、拷贝构造函数、析构函数和赋值函数

    一.题目: class String { public: String(const char *str = NULL); // 普通构造函数 String(const String &othe ...

  4. String的构造函数、析构函数和赋值函数

    编写类String的构造函数.析构函数和赋值函数 已知类String的原型为: class String { public: String(const char *str = NULL); // 普通 ...

  5. 类string的构造函数、拷贝构造函数和析构函数

    原文:http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/19/2020402.html   类string的构造函数.拷贝构造 ...

  6. C++编译器将自动为类产生四个缺省的函数

    构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹大意, 其实这些貌似简单的函数就象没有顶盖的下水道那样危险. 每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包 ...

  7. C++(1)C++类四个默认函数---构造函数、析构函数、拷贝函数、赋值函数

    C++构造函数和析构函数 默认构造函数指不带参数或者所有参数都有缺省值的构造函数!!! (1)构造函数.析构函数与赋值函数 构造函数.析构函数与赋值函数是每个类最基本的函数.它们太普通以致让人容易麻痹 ...

  8. CPP_类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数

    类默认函数:构造函数,拷贝构造函数,赋值函数和析构函数 // person.h #ifndef _PERSON_H_ #define _PERSON_H_ class Person{ public : ...

  9. C++:类中的赋值函数

    先来看一个例子: #include<iostream> #include<string> using namespace std; class Student{ public: ...

随机推荐

  1. linux子系统折腾记 (二)

    今天一早起床,打开debian,居然出现 错误: 0x80070040 .不知道是怎么回事,网上有篇文章详细介绍了windows linux子系统,打算参考来做做:https://www.jiansh ...

  2. Python 经典面试题汇总之框架篇

    前端和框架 1.谈谈你对http协议的认识 浏览器本质,socket客户端遵循Http协议 HTTP协议本质:通过\r\n分割的规范,请求响应之后断开链接 ==> 短连接.无状态 具体: Htt ...

  3. Docker-Docker-compose应用

    Docker-compose是用来定义和运行多容器应用的工具,它是独立于docker存在的,需要单独安装.实际应用场景中,我们的应用可能被打包运行在不同的容器里面,例如一个常规的web应用可能会涉及到 ...

  4. Maven settings.xml

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  5. 【spring源码分析】IOC容器初始化(四)

    前言:在[spring源码分析]IOC容器初始化(三)中已经分析了BeanDefinition注册之前的一些准备工作,下面将进入BeanDefinition注册的核心流程. //DefaultBean ...

  6. pyqt5在textBrowser添加文本并自动滑动到底

    pyqt5在textBrowser添加文本并自动滑动到底 说明: 1.按下按钮pushButton,把单行文本框lineEdit里的内容循环不断的添加到多行文本展示框textBrowser.2.必须要 ...

  7. SpringBoot开发案例之打造私有云网盘

    前言 最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意.无意中发现一个很好用的开源web文件管理器插件 elfinder,功能比较完善,社区也很活跃,还 ...

  8. python icmp\dns\http监控网络各个节点状态,并记录日志

    配置文件如下:支持多节点: { "dns":[{"domainname":"www.baidu.com","dnsserver&q ...

  9. iOS App上架流程(2016详细版)来源DeveloperLY

    一.前言: 作为一名iOSer,把开发出来的App上传到App Store是必要的.下面就来详细讲解一下具体流程步骤. 二.准备: 一个已付费的开发者账号(账号类型分为个人(Individual).公 ...

  10. ios之库Protobuf的使用

    https://blog.csdn.net/dangbai01_/article/details/81099001 (1)Protobuf是什么? Protobuf 即 google protocol ...