1. 程式人生 > >C++複製建構函式,過載賦值運算子

C++複製建構函式,過載賦值運算子

C++的複製建構函式, 賦值建構函式, 有時候會有點暈,下面總結一下:

首先來談一下複製建構函式:

程式碼:

#include<iostream>
using namespace std;
#include<cstring>
#include<cstdlib>

class A
{
	private:
		char *str;
		int num;
	
	public:
		A(char *str, int num)
		{
			this->str = new char[18];
			strcpy(this->str, str);
			this->num = num;
		}
		
		void fuction()
		{
			delete[]str;
		}
		
		void show()
		{
			cout << str << " " << num << endl;
		}
}; 

int main()
{
	A a("zhouyu", 20);
	a.show();
	
	A b = a;  //呼叫了預設的複製建構函式 
	b.show();
	b.fuction(); //釋放了b的str記憶體 
	
	a.show(); //結果字元亂碼 
	return 0;
}
程式碼解釋:

定義了一個類,資料成員有字元指標,和整型數, 函式有建構函式,show函式,和釋放字元記憶體函式

執行一下程式,你會發現第二次呼叫a.show(),結果會是亂碼,關鍵在於A b = a;這句呼叫了預設複製

函式,這個函式做了什麼,通過亂碼的結果我們可想而知,free了b.str,而a.str也free掉了,所以兩個

字元指標指向同一記憶體,所以預設的複製建構函式功能:逐個複製非靜態成員資料;很硬性的

可以加一個自己定義的複製建構函式,這樣就不是地址複製,值複製

程式碼:

A(const A &a)
{
this->str = new char[18];
	strcpy(this->str, a.str);  this->num = a.num;	
} 

複製建構函式呼叫情況:

1:一個物件以值傳遞的方式傳人函式體

2:一個物件以值傳遞的方式從函式返回

3:一個物件要通過另一個物件進行初始化

賦值運算子:

將已有的物件賦給另一個物件時,將使用過載的賦值運算子

程式碼:

#include<iostream>
using namespace std;
#include<cstring>
#include<cstdlib>

class A
{
	private:
		char *str;
		int num;
	
	public:
		A(char *str, int num)
		{
			this->str = new char[18];
			strcpy(this->str, str);
			this->num = num;
		}
		
		void fuction()
		{
			delete[]str;
		}
		
		void show()
		{
			cout << str << " " << num << endl;
		}
}; 

int main()
{
	A a("zhouyu", 20);
	a.show();
	
	A b("zhoukun", 20);
	b.show();
	
	b = a; //呼叫了預設的運算子過載函式
	b.fuction(); //釋放了b的str記憶體 
	
	a.show(); //結果字元亂碼 
	return 0;
}

解釋:會發現結果同樣是亂碼, 不幸的是, 預設的運算子過載函式,跟預設的複製建構函式一樣,也是硬性的

複製非靜態成員資料,同樣我們需要重寫預設的運算子過載函式

程式碼:

A & operator=(const A& a)
{
	this->str = new char[18];
	strcpy(this->str, a.str);
	this->num = a.num; return *this;
}




相關推薦

C++複製建構函式過載運算子

C++的複製建構函式, 賦值建構函式, 有時候會有點暈,下面總結一下: 首先來談一下複製建構函式: 程式碼: #include<iostream> using namespace std; #include<cstring> #include<

C++複製建構函式過載操作符

內容整理自: 函式原型 在C++中建立一個類,這個類中肯定會包括建構函式、解構函式、複製建構函式和過載賦值操作。 複製建構函式是一種特殊的建構函式,其作用也是為類的成員初始化以及為物件的構造分配儲存空間。函式的名稱必須和類名稱一致,無返回型別,它的唯一的一個引數

批註:C++中複製建構函式過載操作符總結:預設淺拷貝,帶指標的需要深拷貝

前言 這篇文章將對C++中複製建構函式和過載賦值操作符進行總結,包括以下內容: 複製建構函式和過載賦值操作符的定義;複製建構函式和過載賦值操作符的呼叫時機;複製建構函式和過載賦值操作符的實現要點;複製建構函式的一些細節。 複製建構函式和過載賦值操作符的定義 我們都知道

C++ 拷貝建構函式過載操作符不能相互呼叫

拷貝建構函式呼叫過載賦值操作符,過載賦值操作符呼叫拷貝建構函式的寫法都是沒有意義的。首先:拷貝建構函式的存在意義--------是通過已有的物件構造新的物件,構造完畢後才有兩個物件;過載賦值操作符的意義-----------將一個物件的值賦給另一個物件,兩個物件都已經構造完畢了。拷貝建構函式----呼叫---

C++11特性--新的類功能--特殊的成員函式(移動建構函式移動運算子),預設方法和禁用方法(default,delete),委託建構函式,管理虛方法(override,final)

      class A      {         public:            void fun(int x )            {               cout<<x<<endl;             }                      

禁用拷貝建構函式過載運算子

【方法】 1,將複製建構函式和賦值操作符宣告為private。 2,若也不允許友元和成員使用,只提供成員的宣告而不提供定義。這樣當程式中出現 複製或賦值現象時,會造成連結錯誤。 #define DISABLE_COPY(Class) \ Class(const Clas

C++結構體:預設建構函式複製建構函式過載=運算子

C++結構體提供了比C結構體更多的功能,如預設建構函式,複製建構函式,運算子過載,這些功能使得結構體物件能夠方便的傳值。 比如,我定義一個簡單的結構體,然後將其作為vector元素型別,要使用的話,就需要實現上述三個函式,否則就只能用指標了。 #include

c++:類拷貝控制 - 拷貝建構函式 & 拷貝運算子

一、拷貝控制 當定義一個類時,我們可以顯式或隱式地指定此型別的物件拷貝、移動、賦值和銷燬時做什麼。 一個類可以通過定義五種特殊的成員函式來控制這些操作,包括:++拷貝建構函式++、++拷貝賦值函式++、++移動建構函式++、++移動複製函式++和++解構函式++。我們稱這些操作為

關於拷貝建構函式過載操作符

拷貝建構函式和過載賦值操作符一般都是一起出現的。 拷貝建構函式: A(const A &rhs) { name=rhs.name; age=new int(); *age=*rhs.age; } 過載賦值操作符: A& operator

C++筆記之為什麼一個類定義了解構函式就幾乎肯定要定義拷貝建構函式和拷貝運算子

這個問題本來很簡單,但是時間久了就容易忘,所以做個筆記用來提示下自己 先來看看這樣一個類: class HasPtr { public: HasPtr(const string& s = string()) :ps(new string(s)), i(0) {

C++ 複製建構函式運算子過載函式

宣告一個空的類testsize,sizeof(testsize)為1,為其宣告建構函式和解構函式,依舊為1 建構函式不能使用關鍵字virtual,解構函式可以 一旦類中存在虛擬函式,就會為該類生成虛擬函式表,並在每一個例項中新增一個指向虛擬函式表的指標,從而大小為一個指標大

C++複製建構函式&移動建構函式複製運算子&移動運算子

一、呼叫時機 1、複製建構函式呼叫的時機 ·物件在建立時使用其他的物件初始化 Person p(q); //此時複製建構函式被用來建立例項p Person p = q; //此時複製建構函式被用來在定義例項p時初始化p return_p()  //當函式返回該型別的物件

複製建構函式操作符過載之間的區別

何時呼叫拷貝(複製)建構函式: StringBad ditto (motto); StringBad metoo = motto; StringBad also = StringBad(motto); StringBad * pStringBad = new

c++實現String類(建構函式解構函式複製建構函式各類運算子過載函式的編寫)

編寫類 String 的建構函式,解構函式,複製建構函式  需要過載下面的運算子: 1、<、>、==和!=比較運算子 2、+=連線運算子和賦值運算子 3、<<輸出運算子和>>輸入運算子 String.h #ifndef _STRING

C++中建構函式拷貝建構函式函式的區別和實現

C++中一般建立物件,拷貝或賦值的方式有建構函式,拷貝建構函式,賦值函式這三種方法。下面就詳細比較下三者之間的區別以及它們的具體實現 1.建構函式 建構函式是一種特殊的類成員函式,是當建立一個類的物件時,它被呼叫來對類的資料成員進行初始化和分配記憶體。(建構函式的命名必須

C++ 複製建構函式運算子過載示例

string1.h // // Created by lance on 10/16/18. // #ifndef CPP_PRIMER_STRING1_H #define CPP_PRIMER_STRING1_H #include <iostream> u

物件隱式轉換複製建構函式過載等號運算子的區別

#include<iostream> #include<string.h> using namespace std; class A{ public: A(char* username) { cnt++; co

如何禁用拷貝建構函式和禁用過載運算子

自定義了一個類,當你覺得不需要系統預設的拷貝建構函式以及過載賦值運算子時,你需要手動禁用這些。 如果類的成員中有指標的話,淺拷貝方式的結果是兩個不同物件的指標指向同一塊記憶體區域,容易出現訪問衝突,多次delete等錯誤,不是我們所希望的。 禁止拷貝/賦值 將拷貝建構函

C++建構函式初始化列表與建構函式中的的區別

C++類中成員變數的初始化有兩種方式:          建構函式初始化列表和建構函式體內賦值。下面看看兩種方式有何不同。          成員變數初始化的順序是按照在那種定義的順序。 1、內部資料型別(char,int……指標等) class Animal { publ

為什麼對於類的const成員只能使用初始化列表而不能在建構函式內部進行操作

結論:對於類的const成員,只能使用初始化列表,而不能在建構函式內部進行賦值操作。原因如下:1、建構函式不能被宣告為const函式,因此當我們建立一個類的const物件時,直到建構函式完成初始化的過程,物件才真正取得其“常量”的屬性,因此,建構函式在const物件的構造過程