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. 七、Android动画

    Android的动画可以分为三种:View动画.帧动画和属性动画,帧动画也属于View动画的一种,只不过它和平移.旋转等常见的View动画在表现形式上略有不同而已. 1.View动画 平移动画:Tra ...

  2. Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块

    Python第十三天   django 1.6   导入模板   定义数据模型   访问数据库   GET和POST方法    SimpleCMDB项目   urllib模块   urllib2模块 ...

  3. Django-1- urls的路由配置, 命名, 重定向, path及re_path

    1-项目目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/index/      2-APP目录下配置(path方法) 这里的访问路径可以是127.0.0.1:8000/t ...

  4. 5G来了,中国移动能力开放平台的NFV,支持面向5G的演进,已经具备初期商用条件!

    近日互联网招聘平台发布的<2019春招旺季人才趋势报告>显示,“新新职业”人才受到企业追捧: 5G相关人才需求大幅增长,5G工程师平均招聘月薪达1.39万元,同比增长12.2%.其中,光传 ...

  5. [ gczdac ] HDU1000

    地址:http://acm.hdu.edu.cn/showproblem.php?pid=1000   Problem Description Calculate A + B.   Input Eac ...

  6. sprintboot 中占位符及多环境配置

    (原) 关于springboot中多环境配置问题 1.在application.properties文件中通过 spring.profiles.active=... 选择系统所要加载的配置文件,这里的 ...

  7. Vue插值文本换行问题

    问题背景: 后端返回的字符串带有\n换行符,但Vue将其插值渲染成div内部文本后,文本并不换行,换行符显示为一个空格. 目标: 让文本在换行符处换行. 解决方法: 思路:实现文本换行有两种方法,一是 ...

  8. vue nextTick使用

    Vue nextTick使用 vue生命周期 原因是在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作无异于徒劳,所以此处一定要将DOM操作的js代码放进Vue. ...

  9. C# 查看EF生成的SQL语句

    用sqlsever追踪最后的sql语句. 返回IQueryable<T>类型, 里面封装的就是生成的SQL脚本,设置断点queryable = DataContext.Set<T&g ...

  10. Java Web的简单项目部署

    目录 项目介绍 安装并配置jdk和tomcat 安装并配置mysql 使用Eclipse导出war包 部署war包到服务器 导出项目的数据库 将项目的数据库导入服务器的数据库中 修改配置 重启Tomc ...