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

以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判断
        {
            length = 0;
            m_data = new char[1];   //对空字符串自动申请存放结束标志'\0'的空
            *m_data = '\0';
        }
        else
        {
            length = strlen(str);
            m_data = new char[length + 1];
            strcpy(m_data, str);
        }
    }
    //析构函数
    virtual ~String()
    {
        delete[] m_data;
    }

    //拷贝构造
    String(const String &str)   //输入参数为const型
    {
        length = str.length;
        m_data = new char[length+1];
        strcpy(m_data, str.m_data);
    }

    //赋值构造
    String& operator=(const String &str)    //输入参数为const型
    {
        if (this == &str)   //检查自赋值
            return *this;
        delete[] m_data;
        int length = strlen(str.m_data);
        m_data = new char[length + 1];
        strcpy(m_data, str.m_data);
        return *this;   //返回本对象的引用
    }

    //重载+
    String operator+(const String &str) const
    {
        String newString("");
        newString.length = length + strlen(str.m_data);
        newString.m_data = new char[newString.length + 1];
        strcpy(newString.m_data, m_data);
        strcat(newString.m_data, str.m_data);
        return newString;
    }

    //重载[]
    inline char& operator[](int n)
    {
        if (n > length)
            return m_data[length - 1];
        else
            return m_data[n];
    }

    //重载+=
    String& operator+=(const String& str)
    {
        length += str.length;
        char *newData = new char[length + 1];
        strcpy(newData,m_data);
        strcat(newData, str.m_data);
        delete[] m_data;
        m_data = newData;
        return *this;
    }

    //重载==
    inline bool operator==(const String& str) const
    {
        if (length != str.length)
            return false;
        return strcmp(m_data, str.m_data) ? false : true;
    }

    inline size_t size() const
    {
        return length;
    }

private:
    char* m_data;
    size_t length;
};

//为什么要重载为友元函数?
/*如果是双目运算符,只要设置一个参数作为右侧运算量,左侧运算符就是对象this本身
 *但是>>或<<左侧运算符是cin或cout而不是对象本身,只能声明为友元了
 *如果一定要声明为成员函数,只能声明为ostream & operator<<(ostream &output)
 *在运用这个<<运算符时就变为这种形式了:data<<cout;不合符人的习惯。
 */

ostream& operator<<(ostream& out,String& str)
{
    out << str.m_data;
    return out;
}

istream& operator>>(istream& in,String& str)
{
    char temp[1024];
    in >> temp;
    str.length = strlen(temp);
    str.m_data = new char[str.length + 1];
    strcpy(str.m_data, temp);
    return in;
}

原文地址:https://www.cnblogs.com/WindSun/p/11434393.html

时间: 2024-08-09 13:00:37

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

【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++基本函数的调用优化(构造、拷贝构造、赋值)

合理的函数可提升时间和空间的利用率 //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++类的成员函数使用的一些小总结

From: http://blog.csdn.net/xiayefanxing/article/details/7607506 这一阵做项目代码开发的时候,用到了在一个C++文件中使用另一个类的成员函数的问题,做个小总结. 其中有些是网上搜索的资料,因为比较分散就不一一给出出处了,请作者见谅. 1.C++如何在一个类的成员函数中调用另一个类的成员函数? 假设你想在类A里调用类B的函数int f(x),两种办法: (1)class A::B 也就是说将B定义为A的父类, 这样你就可以自然的在A里面

C++类的成员函数(在类外定义成员函数、inline成员函数)

类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private(私有的).public (公用的)或protected(受保护的). 在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数).例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用.成员函数可以访问本类中任何成员(包括私有的和公用的),可

C++ 11 线程调用类的成员函数解决办法

在C++中,_beginthreadex 创建线程是很麻烦的.要求入口函数必须是类的静态函数. 通常,可以采用thunk,或者模板来实现. 因C++ 11中引入了 std::async ,可以很好的解决这个问题了. 值得注意的是,在循环中 std::async 创建线程,我试了好多次总是失败,后来看老外的代码,采用 std::move解决了问题. 具体见实现代码. // ConsoleApplication1.cpp : 定义控制台应用程序的入口点. #include "stdafx.h&quo

(转)c++类的成员函数存储方式(是否属于类的对象)---一道面试题引发的思考

昨天去面试一家公司,面试题中有一个题,自己没弄清楚,先记录如下: class D { public: void printA() { cout<<"printA"<<endl; } virtual void printB() { cout<<"printB"<<endl; } }; main函数调用: D *d=NULL; d->printA(); d->printB(); 输出结果是? 当时想的是对象d直

作为类的成员函数,重载运算符只能有一个参数

1 overload a operator of a class, you can only use one para., this pointer is automatically used. class Rational { public: //not correct since this ponit would be used automatically. //Rational operator+ (const Rational& lhs, const Rational& rhs);

类的成员函数实现线程的回调函数

一般都是用静态函数作为线程的回调函数实现,但是总是感觉不是很顺畅,更改吧,就好像破坏了类的封装性,不改吧,访问实在是麻烦.所以,今天要做的就是让类的成员函数作为线程的回调函数存在,其中使用的一个比较特殊的结构就是 union { void ( *ThreadProc)(LPVOID pvParam); void ( student::*MemberProc)(LPVOID pvParam); } Proc; 联合类,用于转换类成员方法指针到普通函数指针 下面是一个小李子,变量名 就凑活看吧,核心

类的成员函数后面加const有什么用(c++常问问题六)

每个类的成员函数都默认传入this指针,成员函数后面加了const后该成员函数将不能修改该类的成员了 class cat { public: cat(){}; string getName() const { this->m_strName = “”;//错误,const this不允许修改成员 return this->m_strName; //正确,没修改 } protected: string m_strName; }

const修饰类的成员函数

<Effective C++>里面说,尽量使用const,const修饰变量一般有两种方式:const T *a,或者 T const *a,这两者都是一样的,主要看const位于*的左边还是右边,这里不再赘述,主要来看一下当const修饰类的成员函数时,成员函数有什么特点. 类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变. 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函