⑴ 拷貝構造函數在哪幾種情況下調用
有時候需要自己定義拷貝構造函數,以避免淺拷貝問題。
在什麼情況下需要用戶自己定義拷貝構造函數:
一般情況下,當類中成員有指針變數、類中有動態內存分配時常常需要用戶自己定義拷貝構造函數。
在什麼情況下系統會調用拷貝構造函數:(三種情況)
(1)用類的一個對象去初始化另一個對象時
(2)當函數的形參是類的對象時(也就是值傳遞時),如果是引用傳遞則不會調用
(3)當函數的返回值是類的對象或引用時
#include <iostream>
using namespace std;
class A
{
private:
int a;
public:
A(int i){a=i;} //內聯的構造函數
A(A &aa);
int geta(){return a;}
};
A::A(A &aa) //拷貝構造函數
{
a=aa.a;
cout<<"拷貝構造函數執行!"<<endl;
}
int get_a(A aa) //參數是對象,是值傳遞,會調用拷貝構造函數
{
return aa.geta();
}
int get_a_1(A &aa) //如果參數是引用類型,本身就是引用傳遞,所以不會調用拷貝構造函數
{
return aa.geta();
}
A get_A() //返回值是對象類型,會調用拷貝構造函數。會調用拷貝構造函數,因為函數體內生成的對象aa是臨時的,離開這個函數就消失了。所有會調用拷貝構造函數復制一份。
{
A aa(1);
return aa;
}
A& get_A_1() //會調用拷貝構造函數,因為函數體內生成的對象aa是臨時的,離開這個函數就消失了。所有會調用拷貝構造函數復制一份。
{
A aa(1);
return aa;
}
int _tmain(int argc, _TCHAR* argv[])
{
A a1(1);
A b1(a1); //用a1初始化b1,調用拷貝構造函數
A c1=a1; //用a1初始化c1,調用拷貝構造函數
int i=get_a(a1); //函數形參是類的對象,調用拷貝構造函數
int j=get_a_1(a1); //函數形參類型是引用,不調用拷貝構造函數
A d1=get_A(); //調用拷貝構造函數
A e1=get_A_1(); //調用拷貝構造函數
return 0;
⑵ java中有沒有拷貝構造函數這個概念
Java中對象的直接賦值都是賦reference,比如:
MyObject a = b;
a和b就指向了同一塊內存,所以,肯定沒有什麼 constructor了!
⑶ Java中拷貝構造方法
構造函數是創建對象時調用的函數,構造函數可以重載,復制構造函數是一種特殊構造函數,具體可以上網查
⑷ Java實現自定義數組的拷貝構造函數
好難哦!!!
⑸ java中拷貝構造方法怎麼用的就是public(或private等) 類名(類名 名稱)
public class T {
private String a;
private String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
//用構造函數復制,根據需要復制相應的屬性。比如你不想復制屬性a,則下面第一句話就不用。
public T(T source){
a = source.a;
b = source.b;
}
public T(){
}
//用方法復制。
public T clone(){
T t = new T();
t.a= a;
t.b = b;
return t;
}
public static void main(String[] args) {
T t1 = new T();
t1.setA("a");
T t2 = new T(t1);
T t3 = t1.clone();
System.out.println(t2.getA() );
System.out.println(t3.getA());
}
⑹ java中有拷貝構造函數的概念嗎方法傳遞對象時一般如何避免副作用
我也是找的,希望幫到你。
在C++中,下面三種對象需要調用拷貝構造函數(有時也稱「復制構造函數」)
1) 一個對象作為函數參數,以值傳遞的方式傳入函數體
2) 一個對象作為函數返回值,以值傳遞的方式從函數返回
3) 一個對象用於給另外一個對象進行初始化(常稱為復制初始化)
當用引用變數做參數時,不調用拷貝構造函數,用傳遞引用的方式給函數傳遞一個對象的引用時,只傳遞了該對象的地址,系統消耗較小。在函數體內訪問 形參,實際是訪問了這個作為實參的對象。例如:void function(CTest & test);
Java中的引用傳遞是指: 例如:void function(CTest test),沒有&號
通常的原則是:①對於凡是包含動態分配成員或包含指針成員的類都應該提供拷貝構造函數;②在提供拷貝構造函數的同時,還應該考慮重載"="賦值操作符號。
具體過程:首先建立對象theObjtwo,並調用其構造函數,然後成員被復制初始化。
其完成方式是內存拷貝,復制所有成員的值。完成後,theObjtwo.pBuffer==theObjone.pBuffer。
即它們將指向同樣的地方,指針雖然復制了,但所指向的空間並沒有復制,而是由兩個對象共用了。這樣不符合要求,對象之間不獨立了,並為空間的刪除帶來隱患。所以需要採用必要的手段來避免此類情況:可以在構造函數中添加操作來解決指針成員的這種問題。
所以C++語法中除了提供預設形式的構造函數外,還規范了另一種特殊的構造函數:拷貝構造函數,一種特殊的構造函數重載。上面的語句中,如果類中定義了拷貝構造函數,在對象復制初始化時,調用的將是拷貝構造函數,而不是預設構造函數。在拷貝構造函數中,可以根據傳入的變數,復制指針所指向的資源。
拷貝構造函數的格式為:類名(const 類名& 對象名);//拷貝構造函數的原型,參數是常量對象的引用。由於拷貝構造函數的目的是成員復制,不應修改原對象,所以建議使用const關鍵字。
下面介紹拷貝構造函數的另一種調用:當對象直接作為參數傳給函數時,函數將建立對象的臨時拷貝,這個拷貝過程也將調用拷貝構造函數。
總結:當某對象是按值傳遞時(無論是作為函數參數,還是作為函數返回值),編譯器都會先建立一個此對象的臨時拷貝,而在建立該臨時拷貝時就會調用類的拷貝構造函數。
拷貝構造函數的實現:
類名::類名(類名&對象名)//拷貝構造函數的實現/定義
⑺ java中構造方法和拷貝構造方法是什麼意思
構造函數只能進行淺,就是只能復制簡單類型如int,float數據到另一副本。
如果對象中包含了對象等復雜類型,淺拷貝對象其實是對象的引用,而不是重新生成一個新副本。這時,如果對一個實例的內部類類型修改,其他實例的內部類類型也會被修改。這時就需要構造函數來進行深復制(也就是使對象中包含的類等復雜類型使用值賦值,而不是引用賦值)。
⑻ Java中,什麼是復制構造函數
Java不支持像C++中那樣的復制構造函數,這個不同點是因為如果不自己寫構造函數的情況下,Java不會創建默認的復制構造函數。
⑼ java中有類似C++中的拷貝構造函數的方法嗎
public
class
Test{
private
int
a,b,c;
public
Test(Test
tTest){
//1
通過反射原理把
tTest中[a,b,c]的值付給this.[a,b,c]
//手工寫代碼
如this.a
=
tTest.a,this.b=tTest.b
等等
}
}