拷貝構造函式呼叫時機(用乙個物件初始化另乙個物件時)
賦值建構函式的四種呼叫場景(呼叫時機)
第1和第2個呼叫場景
#include "iostream"
using namespace std;
class aa
public:
aa() //無參建構函式 預設建構函式
cout<<"我是建構函式,自動被呼叫了"a = _a;
aa(const aa &obj2)//拷貝建構函式 (也叫賦值建構函式) 紅色部分是類本身的名字
cout<<"我也是建構函式,我是通過另外乙個物件obj2,來初始化我自己"~aa()
cout<<"我是析構函式,自動被呼叫了"printf("a:%d \n", a);
protected:
private:
int a;
//單獨搭建乙個舞台
void objplay01()
aa a1; //變數定義
//賦值建構函式的第乙個應用場景(等號法)
//用物件1 初始化 物件2
aa a2 = a1; //定義變數並初始化 //初始化法(等號法)
a2 = a1; //用a1來=號給a2 編譯器給我們提供的淺copy
第二個應用場景
//單獨搭建乙個舞台
void objplay02()
aa a1(10); //變數定義
//賦值建構函式的第二個應用場景括號法
//用物件1 初始化 物件2
aa a2(a1); //定義變數並初始化 //括號法
//a2 = a1; //用a1來=號給a2 編譯器給我們提供的淺copy
a2.geta();
//注意:初始化操作 和 等號操作 是兩個不同的概念
第3個呼叫場景類作為函式引數
#include "iostream"
using namespace std;
class location
public:
location( int xx = 0 , int yy = 0 )
x = xx ; y = yy ; cout << "constructor object.\n" ;
location( const location & p ) //複製建構函式
x = p.x ; y = p.y ; cout << "copy_constructor called." << endl ;
~location()
cout << x << "," << y << " object destroyed." << endl ;
int getx () int gety ()
private : int x , y ;
//alt + f8 排版
void f ( location p )
cout << "funtion:" << p.getx() << "," << p.gety() << endl ;
void mainobjplay()
location a ( 1, 2 ) ; //形參是乙個元素,函式呼叫,會執行實參變數初始化形參變數
f ( a ) ;
void main()
mainobjplay();
system("pause");
第4個呼叫場景作函式返回值
第四個應用場景
#include "iostream"
using namespace std;
class location
public:
location( int xx = 0 , int yy = 0 )
x = xx ; y = yy ; cout << "constructor object.\n" ;
location( const location & p ) //複製建構函式
x = p.x ; y = p.y ; cout << "copy_constructor called." << endl ;
~location()
cout << x << "," << y << " object destroyed." << endl ;
int getx () int gety ()
private : int x , y ;
//alt + f8 排版
void f ( location p )
cout << "funtion:" << p.getx() << "," << p.gety() << endl ;
location g()
location a(1, 2);
return a;
//物件初始化操作 和 =等號操作 是兩個不同的概念
//匿名物件的去和留,關鍵看,返回時如何接
void mainobjplay()
//若返回的匿名物件,賦值給另外乙個同型別的物件,那麼匿名物件會被析構
//location b;
//b = g();//用匿名物件賦值給b物件,然後匿名物件析構
//若返回的匿名物件,來初始化另外乙個同型別的物件,那麼匿名物件會直接轉成新的物件
location b = g();
cout<<"傳智掃地僧測試"mainobjplay();
system("pause");
4預設建構函式
二個特殊的建構函式
1)預設無參建構函式
當類中沒有定義建構函式時,編譯器預設提供乙個無參建構函式,並且其函式體為空
2)預設拷貝建構函式
當類中沒有定義拷貝建構函式時,編譯器預設提供乙個預設拷貝建構函式,簡單的進行成員變數的值複製
1)當類中沒有定義任何乙個建構函式時,c++編譯器會提供預設無參建構函式和預設拷貝建構函式
2)當類中定義了拷貝建構函式時,c++編譯器不會提供無引數建構函式
3) 當類中定義了任意的非拷貝建構函式(即:當類中提供了有參建構函式或無參建構函式),c++編譯器不會提供預設無參建構函式
4 )預設拷貝建構函式成員變數簡單賦值
總結:只要你寫了建構函式,那麼你必須用。
構造析構階段性總結
1)建構函式是c++中用於初始化物件狀態的特殊函式
2)建構函式在物件建立時自動被呼叫
3)建構函式和普通成員函式都遵循過載規則
4)拷貝建構函式是物件正確初始化的重要保證
5)必要的時候,必須手工編寫拷貝建構函式
*****===》1個物件的初始化講完了,增加乙個案例。
拷貝建構函式,預設拷貝建構函式
拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...
建構函式 拷貝建構函式
建構函式可以分為三類 1 不帶引數的建構函式 在函式體中對資料成員賦初值,這種方式使該類的每乙個物件都得到同一組初值 2 帶引數的建構函式 如果使用者希望對不同的物件賦不同的初值,可以採用帶引數的建構函式。在呼叫不同物件的建構函式時從外面將不同的資料傳遞給建構函式,以實現初始化 3 複製建構函式 建...
建構函式 拷貝建構函式
person person 引用就是指標常量 所以person p person const p,引用所以一旦初始化指向某個位址,就不能在改變了。為什麼前面還要加const,因為拷貝建構函式的目的就是將乙個物件的所有屬性拷貝到另外乙個物件,這個物件的屬性不變,加上const 相當於 const pe...