日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

拷贝构造,操作符重载

發布時間:2024/9/27 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拷贝构造,操作符重载 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 拷貝構造

  • #include <iostream>

    #include <string.h>

    ?

    using namespace std;

    ?

    class mystring

    {

    public:

    ??? char *s;

    public:

    ??? mystring()

    ??? {

    ???????s = new char[1024];

    ???????cout << "mystring" << endl;

    ??? }

    ??? //拷貝構造

    ??? mystring(const mystring &it)

    ??? {

    ???????s= new char[1024];

    ???????memset(s,0,1024);

    ???????strcpy(s,it.s);

    ??? }

    ?

    ??? ~mystring()

    ??? {

    ???????cout << "~mystring" << endl;

    ??? }

    };

    ?

    int main()

    {

    ??? mystring str1;

    ??? strcpy(str1.s,"hello world");

    ??? //這種方式只調用了一次構造方法

    ??? mystring str2 = str1;

    ?

    //??? mystring str2;

    //??? str2 = str1;? //這個過程不是拷貝構造的過程,只是=號操作

    ?

    ??? cout << str2.s << endl;

    ??? return 0;

    }

    運行后的效果是:

    當把代碼改成下面的方式的時候,執行結果如下:

    #include <iostream> #include <string.h> ? using namespace std; ? class mystring { public: ??? char *s; public: ??? mystring() ??? { ??????? s = new char[1024]; ??????? cout << "mystring" << endl; ??? } ??? //拷貝構造 ??? mystring(const mystring &it) { ??? cout << "copy mystring" << endl; ??????? s= new char[1024]; ??????? memset(s,0,1024); ??????? strcpy(s,it.s); ??? } ? ??? ~mystring() ??? { ??????? cout << "~mystring" << endl; ??????? delete []s; } }; ? int main() { ??? mystring str1; ??? strcpy(str1.s,"hello world"); ??? //這種方式只調用了一次構造方法 ??? //mystring str2 = str1; ? ??? mystring str2; ??? str2 = str1;? //這個過程不是拷貝構造的過程,只是=號操作 ? ??? cout << str2.s << endl; ??? return 0; } str1 = str2的本質

    2.操作符重載規則

    重載操作符函數可以對操作作出新的解釋,但原有基本予以不變:

    A:不改變操作符的優先級

    B:不改變操作符的結合性

    C:不改變操作符需要的操作數

    D:不能創建新的操作符

    成員的語法形式為:

    ???????? 類型 類名::operator op(參數表)

    {

    ??? //相對于該類定義的操作

    }

    ? 重載賦值操作符

    ? 賦值操作符重載用于對象數據的復制

    ? operator= 必須重載為成員函數

    ? voidoperator = (const classname &it);

    ?classname &operator = (const classname &it);

    ? 返回引用會支持如下語法:obj1= obj2 = obj3;

    ?

    3.操作符重載的案例:

    #include <iostream>

    #include <stdlib.h>

    #include <string.h>

    ?

    using namespace std;

    ?

    class mystring

    {

    public:

    ??? char *s;

    public:

    ??? mystring()

    ??? {

    ???????s = new char[1024];

    ???????cout << "mystring" << endl;

    ??? }

    ??? mystring(const mystring &it)//深拷貝

    ??? {

    ???????cout << "copy mystring" << endl;

    ???????s = new char[1024];

    ???????memset(s, 0, 1024);

    ???????strcpy(s, it.s);

    ??? }

    ?

    ??? ~mystring()

    ??? {

    ???????cout << "~mystring" << endl;

    ???????delete []s;

    ??? }

    ?

    ??? mystring operator =(const mystring &it)//重載了一個=號操作符

    ??? {

    ???????cout << "= operator" << endl;

    ???????memset(s, 0, 1024);

    ???????strcpy(s, it.s);

    ???????//在這個過程中調用了深拷貝的過,這里是以個臨時的拷貝過程,拷貝完成之后調用深拷貝

    ???????return *this;

    ??? }

    ?

    ??? mystring operator =(const char *str)//重載了一個=號操作符

    ??? {

    ???????memset(s, 0, 1024);

    ???????strcpy(s, str);

    ???????return *this;

    ??? }

    ?

    ??? mystring operator =(int i)//重載了一個=號操作符

    ??? {

    ???????memset(s, 0, 1024);

    ???????sprintf(s, "%d", i);

    ???????return *this;

    ??? }

    ?

    ??? mystring operator + (const mystring &it)//重載了一個+號操作符

    ??? {

    ???????strcat(s, it.s);

    ???????return *this;

    ??? }

    ?

    ??? mystring operator + (const char *str)//重載了一個+號操作符

    ??? {

    ???????strcat(s, str);

    ???????return *this;

    ??? }

    ?

    ??? void operator +=(const char *str)//

    ??? {

    ???????strcat(this->s, str);

    ??? }

    ?

    ??? mystring operator + (int i)//重載了一個+號操作符,一元操作符重載

    ??? {

    ???????char temp[100] = {0};

    ???????sprintf(temp, "%d", i);

    ???????strcat(s, temp);

    ???????return *this;

    ??? }

    ??? void operator <<(const char *str)//<<操作符定義為賦值

    ??? {

    ???????strcpy(s, str);

    ??? }

    ?

    ??? void operator >>(char *str)//<<操作符定義為賦值

    ??? {

    ???????strcpy(str, s);

    ??? }

    ?

    ??? mystring operator ++(int)//重載++操作符的函數int參數是固定

    ??? {

    ???????int len = strlen(s);

    ???????for(int i = 0;i < len; i++)

    ???????{

    ???????????s[i]++;//s的第一個成員char + 1,就是將s[0]對應字符的ASCII + 1

    ???????}

    ???????return *this;

    ??? }

    ?

    ??? void * operator new(size_t size)//如果重載的new,那么必須重載delete

    ??? {

    ???????//參數size就是sizeof(mystring)的大小.

    ???????cout << "size = " << size << endl;

    ???????mystring *p = (mystring *)malloc(size);

    ???????return p;

    ??? }

    ?

    ??? void * operator new[](size_t size)//如果重載的new,那么必須重載delete

    ??? {

    ???????//參數size就是sizeof(mystring)的大小 * new[x] + 4個字節.

    ???????cout << "size = " << size << endl;

    ???????//mystring *p = (mystring *)malloc(size);

    ???????return NULL;

    ??? }

    ?

    ??? void operator delete[](void *obj)

    ??? {

    ???????free((mystring *)obj);

    ???????obj = NULL;

    ??? }

    ?

    ??? void operator delete(void *obj)

    ??? {

    ???????free((mystring *)obj);//不能直接free一個void *

    ???????obj = NULL;//防止野指針

    ??? }

    ?

    ??? bool operator ==(const mystring &it)

    ??? {

    ???????if (strcmp(s, it.s) == 0)//如果this->sits相同,就返回true

    ???????{

    ???????????return true;

    ???????}else

    ???????????return false;

    ??? }

    ?

    ??? bool operator ==(const char *str)

    ??? {

    ???????if (strcmp(s, str) == 0)//如果this->sits相同,就返回true

    ???????{

    ???????????return true;

    ???????}else

    ???????????return false;

    ??? }

    ?

    ??? //如果返回的是char,代表的是一個右值,右值是不能直接賦值的,

    ??? //如果返回的是char的引用,那么[]就可以當左值使用了

    ??? char &operator[](int index)

    ??? {

    ???????return s[index];

    ??? }

    ?

    ??? void operator ()(const char *str)//重載函數調用操作符

    ??? {

    ???????strcpy(s, str);

    ??? }

    ?

    ??? void operator ()(int i)

    ??? {

    ???????sprintf(s, "%d", i);

    ??? }

    ?

    ??? operator int()

    ??? {

    ???????return atoi(s);

    ??? }

    ?

    ??? friend mystring operator +(const char *str, const mystring &it);

    ?

    };

    ?

    bool operator ==(const char *str, const mystring &it)

    {

    ??? if (strcmp(str, it.s) == 0)

    ??? {

    ???????return true;

    ??? }else

    ???????return false;

    }

    ?

    //操作符重載,有一個最基本條件,就是一定有一個一元是一個自定義的C++

    //如果兩個都是基本數據類型操作符重載是非法的

    ?

    mystring operator +(const char *str, const mystring &it)

    {

    ??? mystring str1;

    ??? char buf[1024] = {0};

    ??? sprintf(buf, "%s%s", str, it.s);

    ??? strcpy(str1.s, buf);

    ??? return str1;

    }

    ?

    mystring operator ++(mystring &it)

    {

    ??? int len = strlen(it.s);

    ??? for(int i = 0;i < len; i++)

    ??? {

    ???????it.s[i]++;//s的第一個成員char + 1,就是將s[0]對應字符的ASCII + 1

    ??? }

    ??? return it;

    }

    ?

    mystring operator +(int i, const mystring &it)

    {

    ??? mystring str1;

    ??? char buf[1024] = {0};

    ??? sprintf(buf, "%d%s", i, it.s);

    ??? strcpy(str1.s, buf);

    ??? return str1;

    }

    ?

    class demo

    {

    public:

    ??? demo()

    ??? {

    ?

    ??? }

    };

    ?

    void test(int i)

    {

    ??? cout << i << endl;

    }

    ?

    ?

    int main()

    {

    //??? mystring str;

    //??? str << "123";

    ?

    //??? test(str);//導致C++編譯器自動的配備int()操作符

    ?

    ??? mystring *p = new mystring;

    ??? delete p;

    ?

    //??? mystring *p = (mystring *)malloc(sizeof(mystring));

    //??? free(p);

    ?

    ?

    ??? return 0;

    }

    ?

    ?

    int main04()

    {

    ??? mystring str1;

    ??? str1 << "hello";

    ??? mystring str2;

    ??? str2 << "hello";

    ?

    ??? if ("hello" == str1)

    ??? {

    ???????cout << "true" << endl;

    ??? }else

    ??? {

    ???????cout << "fasle" << endl;

    ??? }

    ?

    ??? str1[2] = 'a';

    ?

    ??? //str1("aaaaaaaa");

    ??? str1(10);

    ?

    ??? cout << str1.s << endl;

    ?

    ?

    ?

    ?

    ??? return 0;

    ?

    }

    ?

    int main03()

    {

    ??? cout << "mystring size =" << sizeof(mystring) << endl;

    ??? mystring str1;

    ??? str1 =? "hello";

    ??? mystring str2;

    ??? str2 = " world";

    ??? mystring str3;

    ??? //str3 = str1 + str2;//C++編譯器來講,不能識別兩個類+是什么含義

    ??? //str3 = str1 + "aaaaaaaaaaaa";

    ??? //str3 = str1 + 100;

    ??? //str3 = "AAAAA" + str1;

    ??? str3 = 100 + str1;

    ??? str3 += "BBBBBB";

    ??? str3 << "CCCCC";

    ??? char buf[1024] = {0};

    ??? str3 >> buf;

    ??? str2 = str3++;

    ??? str2 = ++str3;

    ?

    ??? mystring *pstr = new mystring;

    ??? delete pstr;

    ?

    ??? cout << str3.s << endl;

    ??? return 0;

    }

    ?

    ?

    int main01()

    {

    ??? mystring str1;

    ??? strcpy(str1.s, "hello world");

    ??? mystring str2;

    ??? str2 = str1;//這個過程不是拷貝構造的過程,只是=號操作

    ??? //str2.operator =(str1);//和直接寫=號是一摸一樣的

    ?

    ??? cout << str2.s << endl;

    ?

    ??? str2 = "test";//C++編譯器不能理解把一個字符串賦給一個類是什么含義

    ?

    ??? mystring str3;

    ?

    ??? str3 = str2 = 100;

    ??? //str3 = str2.operator =(100);//上一條語句的等效語法

    ?

    ??? cout << str2.s << endl;

    ?

    ??? return 0;

    }

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    總結

    以上是生活随笔為你收集整理的拷贝构造,操作符重载的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。