拷贝构造,操作符重载
拷貝構造
#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->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,代表的是一個右值,右值是不能直接賦值的,
??? //如果返回的是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;
}
?
?
?
?
?
?
??
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的拷贝构造,操作符重载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10怎么从装系统 教你win10系
- 下一篇: C语言文件操作函数的编写