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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

拷贝构造,操作符重载

發(fā)布時(shí)間:2024/9/27 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拷贝构造,操作符重载 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  • 拷貝構(gòu)造

  • #include <iostream>

    #include <string.h>

    ?

    using namespace std;

    ?

    class mystring

    {

    public:

    ??? char *s;

    public:

    ??? mystring()

    ??? {

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

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

    ??? }

    ??? //拷貝構(gòu)造

    ??? 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");

    ??? //這種方式只調(diào)用了一次構(gòu)造方法

    ??? mystring str2 = str1;

    ?

    //??? mystring str2;

    //??? str2 = str1;? //這個(gè)過(guò)程不是拷貝構(gòu)造的過(guò)程,只是=號(hào)操作

    ?

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

    ??? return 0;

    }

    運(yùn)行后的效果是:

    當(dāng)把代碼改成下面的方式的時(shí)候,執(zhí)行結(jié)果如下:

    #include <iostream> #include <string.h> ? using namespace std; ? class mystring { public: ??? char *s; public: ??? mystring() ??? { ??????? s = new char[1024]; ??????? cout << "mystring" << endl; ??? } ??? //拷貝構(gòu)造 ??? 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"); ??? //這種方式只調(diào)用了一次構(gòu)造方法 ??? //mystring str2 = str1; ? ??? mystring str2; ??? str2 = str1;? //這個(gè)過(guò)程不是拷貝構(gòu)造的過(guò)程,只是=號(hào)操作 ? ??? cout << str2.s << endl; ??? return 0; } str1 = str2的本質(zhì)

    2.操作符重載規(guī)則

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

    A:不改變操作符的優(yōu)先級(jí)

    B:不改變操作符的結(jié)合性

    C:不改變操作符需要的操作數(shù)

    D:不能創(chuàng)建新的操作符

    成員的語(yǔ)法形式為:

    ???????? 類(lèi)型 類(lèi)名::operator op(參數(shù)表)

    {

    ??? //相對(duì)于該類(lèi)定義的操作

    }

    ? 重載賦值操作符

    ? 賦值操作符重載用于對(duì)象數(shù)據(jù)的復(fù)制

    ? operator= 必須重載為成員函數(shù)

    ? voidoperator = (const classname &it);

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

    ? 返回引用會(huì)支持如下語(yǔ)法: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)//重載了一個(gè)=號(hào)操作符

    ??? {

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

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

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

    ???????//在這個(gè)過(guò)程中調(diào)用了深拷貝的過(guò),這里是以個(gè)臨時(shí)的拷貝過(guò)程,拷貝完成之后調(diào)用深拷貝

    ???????return *this;

    ??? }

    ?

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

    ??? {

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

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

    ???????return *this;

    ??? }

    ?

    ??? mystring operator =(int i)//重載了一個(gè)=號(hào)操作符

    ??? {

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

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

    ???????return *this;

    ??? }

    ?

    ??? mystring operator + (const mystring &it)//重載了一個(gè)+號(hào)操作符

    ??? {

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

    ???????return *this;

    ??? }

    ?

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

    ??? {

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

    ???????return *this;

    ??? }

    ?

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

    ??? {

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

    ??? }

    ?

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

    ??? {

    ???????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)//重載++操作符的函數(shù)int參數(shù)是固定

    ??? {

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

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

    ???????{

    ???????????s[i]++;//s的第一個(gè)成員char + 1,就是將s[0]對(duì)應(yīng)字符的ASCII + 1

    ???????}

    ???????return *this;

    ??? }

    ?

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

    ??? {

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

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

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

    ???????return p;

    ??? }

    ?

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

    ??? {

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

    ???????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一個(gè)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,代表的是一個(gè)右值,右值是不能直接賦值的,

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

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

    ??? {

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

    ??? }

    ?

    ??? void operator ()(const char *str)//重載函數(shù)調(diào)用操作符

    ??? {

    ???????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;

    }

    ?

    //操作符重載,有一個(gè)最基本條件,就是一定有一個(gè)一元是一個(gè)自定義的C++類(lèi)

    //如果兩個(gè)都是基本數(shù)據(jù)類(lèi)型操作符重載是非法的

    ?

    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的第一個(gè)成員char + 1,就是將s[0]對(duì)應(yīng)字符的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);//導(dǎo)致C++編譯器自動(dòng)的配備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;//對(duì)C++編譯器來(lái)講,不能識(shí)別兩個(gè)類(lèi)+是什么含義

    ??? //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;//這個(gè)過(guò)程不是拷貝構(gòu)造的過(guò)程,只是=號(hào)操作

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

    ?

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

    ?

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

    ?

    ??? mystring str3;

    ?

    ??? str3 = str2 = 100;

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

    ?

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

    ?

    ??? return 0;

    }

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    總結(jié)

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

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。