C++子对象和堆对象
生活随笔
收集整理的這篇文章主要介紹了
C++子对象和堆对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
子對象
當一個類的成員是某一個類的對象時,該對象就為子對象。子對象實際就是對象成員。如:
class A
{
public:
…
private:
…
};
class B
{
public:
…
private:
A a;
…
};
其中,B類中成員a就是子對象,它是A類的對象作為B類的成員。
在類中出現了子對象或稱對象成員時,該類的構造函數要包含對子對象的初始化,通常采用成員初始化表的方法來初始化子對象。在成員初始化表中包含對子對象的初始化和對類中其他成員的初始化。下面舉一例子說明成員初始化的構造。
#include
class A
{
public:
A(int i, int j) { A1=i; A2=j; }
void print() { cout< private:
int A1, A2;
};
class B
{
public:
B(int i, int j, int k):a(i, j), b(k)
{
}
void print();
private:
A a; file://子對象
int b;
};
void B::print()
{
a.print();
cout< }
void main()
{
B b(6, 7, 8);
b.print();
}
該程序的輸出結果為:
6,7
8
其中,a(i, j), b(k)是成員初始化表,它有二項,前一項是給子對象a初始化,其格式如下:
<子對象名> (<參數表>)
后一項是給類B的數據成員b初始化。這一項也可以寫在構造函數的函數體內,使用賦值表達式語句
b = k;
給類B的數據成員初始化。
堆對象
所謂堆對象是指在程序運行過程中根據需要隨時可以建立或刪除的對象。這種堆對象被創建在內存一些空閑的存儲單元中,這些存儲單元被稱為堆。它們可以被創建的堆對象占有,也可以通過刪除堆對象而獲得釋放。
創建或刪除堆對象時,需要如下兩個運算符:
new
delete
這兩個運算符又稱為動態分配內存空間運算符。new相當于C語言中malloc()函數,而delete相當于C語言中free()函數。
1. 運算符new的用法
該運算符的功能是用來創建堆對象,或者說,它是用來動態地創建對象。
new運算符使用格式如下:
new <類型說明符> (<初始值列表>)
它表明在堆中建立一個由<類型說明符>給定的類型的對象,并且由括號中的<初始值列表>給出被創建對象的初始值。如果省去括號和括號中的初始值,則被創建的對象選用缺省值。
使用new運算符創建對象時,它可以根據其參數來選擇適當的構造函數,它不用sizeof來計算對象所占的字節數,而可以計算其大小。
new運算符返回一個指針,指針類型將與new所分配對象相匹配,如果不匹配可以通過強制類型的方法,否則將出現編譯錯。
如果new運算符不能分配到所需要的內存,它將返回0,這時的指針為空指針。
運算符new也可以用來創建數組類型的對象,即對象數組。其格式如下:
new <類名> [<算術表達式>]
其中,<算術表達式>的值為所創建的對象數組的大小。如:
A *ptr;
ptr = new A[5];
new還可用來創建一般類型的數組。如:
int *p;
p = new int[10];
使用new[]創建的對象數組或一般數組時,不能為該數組指定初始值,其初始值為缺省值。
2. 運算符delete的用法
該運算符的功能是用來刪除使用new創建的對象或一般類型的指針。其格式如下:
delete <指針名>
例如:
A *ptr;
ptr = new A(5, 6);
delete ptr;
運算符delete也可用來刪除使用new創建對象數組,其使用格式如下:
delete[] <指針名>
同樣,delete也可以刪除由new創建的一般類型的數組。如:
int *p;
p = new int[10];
delete[] p;
使用運算符delete時,應注意如下幾點:
(1) 它必須使用于由運算符new返回的指針;
(2) 該運算符也適用于空指針(即其值為0的指針);
(3) 指針名前只用一對方括號符,并且不管所刪除數組的維數,忽略方括號內的任何數字。
下面舉一例子說明new運算符和delete運算符的使用方法。
#include
class AA
{
public:
AA(int i, int j)
{
A=i; B=j;
cout<<"構造函數./n";
}
~AA() { cout<<"析構函數./n"; }
void print();
private:
int A, B;
};
void AA::print()
{
cout< }
void main()
{
AA *a1, *a2;
a1 = new AA(1, 2);
a2 = new AA(5, 6);
a1->print();
a2->print();
delete a1;
delete a2;
}
該程序的輸出結果為:
構造函數.
構造函數.
1, 2
5, 6
構造函數.
構造函數.
從程序中可以看到:用new創建對象時,要調用構造函數,用delete刪除對象時,要調用析構函數。如果創建或刪除的時對象數組,對象數組有多少,就調用多少次構造函數或構造函數。
在實際應用中,經常對于new運算符返回的指針進行檢驗,看是否分配了有效的內存空間。結合本例給出檢驗方法如下:
if (!a1)
{
cout<<"Heap erroe!/n";
exit(1);
}
下面再舉一個使用new和delete運算符對一般指針和數組的例子。
#include
#include
void fun()
{
int *p;
if (p = new int)
{
*p = 5;
cout<<*p< delete p;
}
else
cout<<"Heap error!/n";
}
void main()
{
fun();
int *pa;
pa = new int[5];
if (!pa)
{
cout<<"Heap error!/n";
exit(1);
}
for (int i=0; i<5; i++)
pa[i] = i+1;
for (i=0; i<5; i++)
cout<<pa[i]<<" ";
cout< delete[] pa;
}
當一個類的成員是某一個類的對象時,該對象就為子對象。子對象實際就是對象成員。如:
class A
{
public:
…
private:
…
};
class B
{
public:
…
private:
A a;
…
};
其中,B類中成員a就是子對象,它是A類的對象作為B類的成員。
在類中出現了子對象或稱對象成員時,該類的構造函數要包含對子對象的初始化,通常采用成員初始化表的方法來初始化子對象。在成員初始化表中包含對子對象的初始化和對類中其他成員的初始化。下面舉一例子說明成員初始化的構造。
#include
class A
{
public:
A(int i, int j) { A1=i; A2=j; }
void print() { cout< private:
int A1, A2;
};
class B
{
public:
B(int i, int j, int k):a(i, j), b(k)
{
}
void print();
private:
A a; file://子對象
int b;
};
void B::print()
{
a.print();
cout< }
void main()
{
B b(6, 7, 8);
b.print();
}
該程序的輸出結果為:
6,7
8
其中,a(i, j), b(k)是成員初始化表,它有二項,前一項是給子對象a初始化,其格式如下:
<子對象名> (<參數表>)
后一項是給類B的數據成員b初始化。這一項也可以寫在構造函數的函數體內,使用賦值表達式語句
b = k;
給類B的數據成員初始化。
堆對象
所謂堆對象是指在程序運行過程中根據需要隨時可以建立或刪除的對象。這種堆對象被創建在內存一些空閑的存儲單元中,這些存儲單元被稱為堆。它們可以被創建的堆對象占有,也可以通過刪除堆對象而獲得釋放。
創建或刪除堆對象時,需要如下兩個運算符:
new
delete
這兩個運算符又稱為動態分配內存空間運算符。new相當于C語言中malloc()函數,而delete相當于C語言中free()函數。
1. 運算符new的用法
該運算符的功能是用來創建堆對象,或者說,它是用來動態地創建對象。
new運算符使用格式如下:
new <類型說明符> (<初始值列表>)
它表明在堆中建立一個由<類型說明符>給定的類型的對象,并且由括號中的<初始值列表>給出被創建對象的初始值。如果省去括號和括號中的初始值,則被創建的對象選用缺省值。
使用new運算符創建對象時,它可以根據其參數來選擇適當的構造函數,它不用sizeof來計算對象所占的字節數,而可以計算其大小。
new運算符返回一個指針,指針類型將與new所分配對象相匹配,如果不匹配可以通過強制類型的方法,否則將出現編譯錯。
如果new運算符不能分配到所需要的內存,它將返回0,這時的指針為空指針。
運算符new也可以用來創建數組類型的對象,即對象數組。其格式如下:
new <類名> [<算術表達式>]
其中,<算術表達式>的值為所創建的對象數組的大小。如:
A *ptr;
ptr = new A[5];
new還可用來創建一般類型的數組。如:
int *p;
p = new int[10];
使用new[]創建的對象數組或一般數組時,不能為該數組指定初始值,其初始值為缺省值。
2. 運算符delete的用法
該運算符的功能是用來刪除使用new創建的對象或一般類型的指針。其格式如下:
delete <指針名>
例如:
A *ptr;
ptr = new A(5, 6);
delete ptr;
運算符delete也可用來刪除使用new創建對象數組,其使用格式如下:
delete[] <指針名>
同樣,delete也可以刪除由new創建的一般類型的數組。如:
int *p;
p = new int[10];
delete[] p;
使用運算符delete時,應注意如下幾點:
(1) 它必須使用于由運算符new返回的指針;
(2) 該運算符也適用于空指針(即其值為0的指針);
(3) 指針名前只用一對方括號符,并且不管所刪除數組的維數,忽略方括號內的任何數字。
下面舉一例子說明new運算符和delete運算符的使用方法。
#include
class AA
{
public:
AA(int i, int j)
{
A=i; B=j;
cout<<"構造函數./n";
}
~AA() { cout<<"析構函數./n"; }
void print();
private:
int A, B;
};
void AA::print()
{
cout< }
void main()
{
AA *a1, *a2;
a1 = new AA(1, 2);
a2 = new AA(5, 6);
a1->print();
a2->print();
delete a1;
delete a2;
}
該程序的輸出結果為:
構造函數.
構造函數.
1, 2
5, 6
構造函數.
構造函數.
從程序中可以看到:用new創建對象時,要調用構造函數,用delete刪除對象時,要調用析構函數。如果創建或刪除的時對象數組,對象數組有多少,就調用多少次構造函數或構造函數。
在實際應用中,經常對于new運算符返回的指針進行檢驗,看是否分配了有效的內存空間。結合本例給出檢驗方法如下:
if (!a1)
{
cout<<"Heap erroe!/n";
exit(1);
}
下面再舉一個使用new和delete運算符對一般指針和數組的例子。
#include
#include
void fun()
{
int *p;
if (p = new int)
{
*p = 5;
cout<<*p< delete p;
}
else
cout<<"Heap error!/n";
}
void main()
{
fun();
int *pa;
pa = new int[5];
if (!pa)
{
cout<<"Heap error!/n";
exit(1);
}
for (int i=0; i<5; i++)
pa[i] = i+1;
for (i=0; i<5; i++)
cout<<pa[i]<<" ";
cout< delete[] pa;
}
總結
以上是生活随笔為你收集整理的C++子对象和堆对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想将推出全新系列笔记本
- 下一篇: Bert演变总结