拷贝构造,操作符重载
拷貝構(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->s和it的s相同,就返回true
???????{
???????????return true;
???????}else
???????????return false;
??? }
?
??? bool operator ==(const char *str)
??? {
???????if (strcmp(s, str) == 0)//如果this->s和it的s相同,就返回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)題。
- 上一篇: win10怎么从装系统 教你win10系
- 下一篇: C语言文件操作函数的编写